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
relative to version 1.
See "Upgrading from MTL 1 to MTL 2" for instructions on how
to make code written for version 1 work with version 2.