You are making two contradictory statements here – or rather, I think, you are using the term “the same” differently than I do. When I say “the same type”, I mean that it is okay for safe code to cast between these types. For example, &'a Box<T> and &'a &'a T are the same type – exposing a transmute back and forth between these two types to safe code is an okay thing to do.
Ownership goes well beyond mere memory, because types can have their own invariants with their own ideas of ownership. Think of using a newtype around () as a magic non-duplicable token that an API uses to ensure an action can only ever be performed by one party. Just because there is no “memory ownership” here doesn’t mean there is no ownership. For this reason, duplicating a ZST is illegal in general, even though there are no aliasing rules that would prevent this. Also see this discussion in the unsafe code guidelines repo.
So, if I cast your statement in my terms, you are saying that &&T and &Pin<T> are not the same type. Exposing the following functions to safe code would not be okay:
fn shr_shr_to_pin<'a, 'b, T>(x: &'a &'b T) -> &'a Pin<'b, T> {
mem::transmute(x)
}
fn shr_pin_to_shr<'a, 'b, T>(x: &'a Pin<'b, T>) -> &'a &'b T {
mem::transmute(x)
}
Actually exploiting this kind of reasoning requires us to talk about shared pinned data. That’s not something we can get for free, we have to explain why sharing this is okay – after all, once sharing is involved, multiple parties could be acting on the same data, and we have to prove that they their interaction will not cause havoc.
“Shared pinned” is different from “pinned” for the same reason that “shared” is different from “owned”.
That is a very interesting thought. So the bit can only be set if there are no outstanding borrows, and you also cannot get a Pin into the RefCell unless the bit is set. Also setting the bit, I suppose, will require a Pin<RefCell<T>>. This could actually work!
Funny enough, with such a construction, we could have borrow_pin take a & RefCell<T> because we know if the bit is set, the RefCell is pinned, even if the shared reference we obtain here doesn’t express that in the type. That’s like run-time tracking of the pin state, matching how RefCell also otherwise run-time-tracks something like the borrow checker state.
I don’t think you need this. You just declare that the contents of the RefCell are considered pinned only once set_pinned was called. The one thing you have to be careful about is a method like fn get_pin(Pin<RefCell<T>>) -> Pin<T>; this would have to check or set the pin bit to make sure we don’t hand out &mut again after get_pin was ever called.
The pin bit is different from the other borrow flags in the sense that, when I have &mut RefCell<T> I can ignore the borrow flags (and get_mut does exactly that) but I cannot ignore the pin bit.
Still, this is very neat 
EDIT: However, it occurs to me that this does not need a shared reference type! Because the pin state is tracked at run-time, and not in the type, borrow_pin and borrow are perfectly happy to hand out pinnd data given a &RefCell<T> if the run-time pin bit says this is pinned.
I am slightly bothered by the fact that we do not have a case for type where both the owned and the pinned, or both the shared and the shared pinned, invariant are interesting. It seems like types that want to exploit pinning only have boring owned invariants, and rather trivial shared invariants. For example, Entry<T>'s shared invariant would literally be True – meaning you cannot do anything useful with an &Entry<T>. Well, maybe it could allow access to an &T? Still, the shared invariant is extremely restricted once a shared pinned invariant exists because it has to work both when the entry is pinned and when it is not (due to the Pin::deref). And the owned invariant usually just says something like “this is still in the initial state, wait for it to get pinned”.
So, having the shared pinned invariant seems necessary, but not remotely as interesting as the owned vs. shared invariants. (Types like RefCell or Rc really go crazy on exploiting their shared invariant, and some of that feeds back into the owned case as well, particularly for Rc.)