You could perhaps write MyWierdMonadT and MyAnotherMonadT.
Also, probably layers package [1] is related to what you ask.
But if you actually want arbitrary nested monads like m1 (m2 (m3 (m4 a))), there's no simple way.
Consider Maybe [MyType Int]. MyType may have or may not have a Monad instance. Even more: it can have instance in one module, but not have in another. But suppose MyType has a Num instance. Then how this should work: return 2 :: Maybe [MyType Int]? Should 2 be of type Int or MyType Int?
Note that you can make an instance Num a => Num [a] which makes sense (lists as polynoms). So the same question arises even for Maybe [Int].
If you *really want to do it* (which I doubt), you can use TH (do determine how many return's to use, though it's ambiguous anyway).