 <p>You can do this using <code>hoist</code> from the <code>mmorph</code> package. <code>hoist</code> lets you modify the base monad of anything that implements <code>MFunctor</code> (which is most monad transformers):</p> <pre><code>hoist :: (MFunctor t) =&gt; (forall x . m x -&gt; n x) -&gt; t m r -&gt; t n r </code></pre> <p>You can then use it for your problem like this:</p> <pre><code>co' tma ma = hoist (co ma) tma </code></pre> <p>Then you're done!</p> <p>To understand why that works, let's go through the types step by step:</p> <pre><code>co :: (Monad m) =&gt; m a -&gt; m a -&gt; m a ma :: (Monad m) =&gt; m a co ma :: (Monad m) =&gt; m a -&gt; m a hoist (co ma) :: (Monad m, MFunctor t) =&gt; t m a -&gt; t m a tma :: (Monad m, MFunctor t) =&gt; t m a hoist (co ma) tma :: (Monad m, MFunctor t) =&gt; t m a </code></pre> <p>Note that <code>hoist</code> has certain laws it must satisfy that ensure that it does "the right thing" that you would expect:</p> <pre><code>hoist id = id hoist (f . g) = hoist f . hoist g </code></pre> <p>These are just functor laws, guaranteeing that <code>hoist</code> behaves intuitively.</p> <p><code>hoist</code> is provided in the <code>Control.Monad.Morph</code> module of the <code>mmorph</code> package, which you can find <a href="http://hackage.haskell.org/package/mmorph" rel="nofollow">here</a>. The bottom of the main module has <a href="http://hackage.haskell.org/packages/archive/mmorph/1.0.0/doc/html/Control-Monad-Morph.html#g:3" rel="nofollow">a tutorial</a> teaching how to use the package</p>