The MTL provides a selection of monads and their transformer variants
along with type classes that allow uniform handling of a base monad and its transformer.
See the package on Hackage.
Version 2 of the MTL has some small
with version 1.
See this page for instructions on how
to make code written for version 1 work with version 2.