diff --git a/library/ListT.hs b/library/ListT.hs
--- a/library/ListT.hs
+++ b/library/ListT.hs
@@ -19,6 +19,7 @@
   fromFoldable,
   fromMVar,
   unfold,
+  unfoldM,
   repeat,
   -- * Transformation utilities
   -- | 
@@ -72,8 +73,8 @@
             return (Just (h1, (mappend s1' (ListT m2))))
 
 instance Functor m => Functor (ListT m) where
-  fmap f (ListT m) =
-    ListT $ (fmap . fmap) (\(a, b) -> (f a, fmap f b)) m
+  fmap f =
+    ListT . (fmap . fmap) (f *** fmap f) . unListT
 
 instance (Monad m, Functor m) => Applicative (ListT m) where
   pure = 
@@ -114,8 +115,8 @@
     lift . liftIO
 
 instance MFunctor ListT where
-  hoist f (ListT m) =
-    ListT $ f $ m >>= return . fmap (\(h, t) -> (h, hoist f t))
+  hoist f =
+    ListT . f . (fmap . fmap) (id *** hoist f) . unListT
 
 instance MMonad ListT where
   embed f (ListT m) =
@@ -291,6 +292,18 @@
 unfold :: (MonadCons m) => (b -> Maybe (a, b)) -> b -> m a
 unfold f s =
   maybe mzero (\(h, t) -> cons h (unfold f t)) (f s)
+
+-- |
+-- Construct by unfolding a monadic data structure
+--
+-- This is the most memory-efficient way to construct a ListT where
+-- the length depends on the inner monad.
+{-# INLINABLE unfoldM #-}
+unfoldM :: (Monad m) => (b -> m (Maybe (a, b))) -> b -> ListT m a
+unfoldM f = go where
+  go s = ListT $ f s >>= \case
+    Nothing -> return Nothing
+    Just (a,r) -> return (Just (a, go r))
 
 -- |
 -- Produce an infinite stream.
diff --git a/list-t.cabal b/list-t.cabal
--- a/list-t.cabal
+++ b/list-t.cabal
@@ -1,7 +1,7 @@
 name:
   list-t
 version:
-  0.4.5.1
+  0.4.6
 synopsis:
   ListT done right
 description:
@@ -43,12 +43,12 @@
   exposed-modules:
     ListT
   build-depends:
-    mmorph == 1.0.*,
-    monad-control >= 0.3 && < 1.1,
+    mmorph == 1.*,
+    monad-control >= 0.3 && < 2,
     mtl == 2.*,
     transformers-base == 0.4.*,
-    transformers >= 0.3 && < 0.5,
-    base-prelude == 0.1.*
+    transformers >= 0.3 && < 0.6,
+    base-prelude < 2
   default-extensions:
     Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFunctor, DeriveGeneric, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, ImpredicativeTypes, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
   default-language:
@@ -65,9 +65,9 @@
   build-depends:
     list-t,
     mmorph,
-    HTF == 0.12.*,
+    HTF == 0.13.*,
     mtl-prelude < 3,
-    base-prelude >= 0.1.3 && < 0.2
+    base-prelude
   default-extensions:
     Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFunctor, DeriveGeneric, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, ImpredicativeTypes, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
   default-language:
