The "lift . lift . lift" expression in multiply stacked monad transformers can often be completely eliminated by using the classes MonadReader, MonadState, MonadIO etc etc, with
putStrLn :: MonadIO m => String -> m ()
ask :: MonadReader r m => m r
modify :: MonadState s m => (s -> s) -> m ()
Now you can define
instance (MonadTrans t, MonadState s m) => MonadState s (t m) where ...
so that any monad transformer applied to a state monad is automatically another state monad. Win!