okay. https://hackage.haskell.org/package/monad-control-1.0.3.1/docs/src/Control.Monad.Trans.Control.html#StT So StT is associated type alias, and there is no injectivity, and probably for good reason. Also, depending on if you have such injectivity, you may also use MPT to take m1 m2 out of function definition: MonadTransCombine t m1 m2 | t -> m1 m2 where