Why must ($) be kind-polymorphic? It seems as though there is a small enough base of unboxed code that having e.g. ($#) would be fine.
If that won't work, would it be possible to have something like
($) :: forall k a (b :: k) . (a -> b) -> a -> b
I don't know if this is possible in Haskell now, but I believe the currently popular dependently typed languages allow this sort of thing.