Difference between `mtl` and `transformers`

Edward Kmett explains at reddit:

transformers provides the data types themselves and requires no real language extensions. e.g. StateT s lives here. mtl provides a set of classes for the individual effects. e.g. MonadState lives here. mtl sits atop transformers.

We split mtl from transformers to allow folks to experiment with different forms of class structures without having to change the actual data types used. (e.g. monads-tf uses type families rather than fundeps, and some of the effect system folks borrow the underlying data types.)