> (I don't think what Andreas said can *literally* be correct, because surely it's safe to unsafeCoerce from a to b when `Coercible a b` is in scope?)

Yes I was perhaps a bit too restrictive. The docs in fact explicitly mention this case among some others. I don't see how it could go wrong here.
In fact the docs mention this case in particular! (https://hackage-content.haskell.org/package/base-4.22.0.0/docs/Unsafe-Coerce.html#v:unsafeCoerce):

> (superseded) Casting between two types which have exactly the same structure: between a newtype of T and T, or between types which differ only in "phantom" type parameters. It is now preferred to use coerce from Data.Coerce, which is type-safe.

But really there is no reason to use dirty tricks like unsafeCoerce in this situation to begin with when `coerce` is right there!

-----------------

As for the question about `Any x` or `f Any` I'm not sure.

The basic idea of unsafeCoerce is really to be able to pass along the underlying pointer using `Any` as long as we don't use it without turning it back into it's original type first.

Trying to use `Any` for type level trickery seems suspicious to me, and I would not be surprised to run into GHC bugs or worse using it that way.
The concrete example sadly doesn't seem to compile. And type level edge cases are really not my speciality so maybe someone else can make more definite statements there.