diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+2024-06-21 Ivan Perez <ivan.perez@keera.co.uk>
+        * Version bump (0.13.0) (#420).
+        * Implement List interface using list-transformer (#418).
+
 2024-04-23 Ivan Perez <ivan.perez@keera.co.uk>
         * Version bump (0.12.3) (#411).
         * Fix typo in documentation (#410).
diff --git a/dunai.cabal b/dunai.cabal
--- a/dunai.cabal
+++ b/dunai.cabal
@@ -30,7 +30,7 @@
 build-type:    Simple
 
 name:          dunai
-version:       0.12.3
+version:       0.13.0
 author:        Ivan Perez, Manuel Bärenz
 maintainer:    ivan.perez@keera.co.uk
 homepage:      https://github.com/ivanperez-keera/dunai
@@ -97,7 +97,11 @@
   default:     False
   manual:      True
 
+flag list-transformer
+  description: Use list-transformer instead of transformers to implement the ListT combinators
+  default: False
 
+
 library
   exposed-modules:
     Control.Monad.Trans.MSF
@@ -146,6 +150,13 @@
         MonadRandom         >= 0.2 && < 0.6
       , transformers-compat >= 0.3 && < 0.8
       , void                >= 0.1 && < 0.8
+
+  if flag(list-transformer)
+    build-depends:
+        list-transformer >= 1.1.1 && < 1.2
+      , transformers     >= 0.3   && < 0.7
+
+    cpp-options: -DLIST_TRANSFORMER
 
 test-suite hlint
   type:
diff --git a/src/Control/Monad/Trans/MSF/List.hs b/src/Control/Monad/Trans/MSF/List.hs
--- a/src/Control/Monad/Trans/MSF/List.hs
+++ b/src/Control/Monad/Trans/MSF/List.hs
@@ -26,9 +26,8 @@
 -- additional constraints on the inner monad in order for the combination of
 -- the monad and the transformer to be a monad. Use at your own risk.
 module Control.Monad.Trans.MSF.List
-    {-# WARNING "This module uses the ListT transformer, which is considered deprecated." #-}
     ( module Control.Monad.Trans.MSF.List
-    , module Control.Monad.Trans.List
+    , module List
     )
   where
 
@@ -37,13 +36,21 @@
 import Control.Applicative ((<$>))
 #endif
 
-import Control.Monad.Trans.List hiding (liftCallCC, liftCatch)
+#ifdef LIST_TRANSFORMER
+import           Control.Monad    (sequence)
+import           List.Transformer (ListT (ListT, next), Step (..), fold, select)
+import qualified List.Transformer as List
+#else
+import Control.Monad.Trans.List as List hiding (liftCallCC, liftCatch)
+#endif
 
 -- Internal imports
 import Data.MonadicStreamFunction.InternalCore (MSF (MSF, unMSF))
 
 -- * List monad
 
+#ifdef LIST_TRANSFORMER
+
 -- | Run an 'MSF' in the 'ListT' transformer (i.e., multiple MSFs producing
 -- each producing one output), by applying the input stream to each MSF in the
 -- list transformer and concatenating the outputs of the MSFs together.
@@ -55,9 +62,43 @@
 widthFirst msf = widthFirst' [msf]
   where
     widthFirst' msfs = MSF $ \a -> do
+      (bs, msfs') <- unzip . concat <$> mapM (toList . flip unMSF a) msfs
+      return (bs, widthFirst' msfs')
+
+    toList :: (Functor m, Monad m) => ListT m a -> m [a]
+    toList = fmap reverse . fold (flip (:)) [] id
+
+-- | Build an 'MSF' in the 'ListT' transformer by broadcasting the input stream
+-- value to each MSF in a given list.
+sequenceS :: Monad m => [MSF m a b] -> MSF (ListT m) a b
+sequenceS msfs = MSF $ \a -> sequence' $ apply a <$> msfs
+  where
+    sequence' :: Monad m => [m a] -> ListT m a
+    sequence' xs = ListT $ next <$> select =<< sequence xs
+
+    apply :: Monad m => a -> MSF m a b -> m (b, MSF (ListT m) a b)
+    apply a msf = do
+      (b, msf') <- unMSF msf a
+      return (b, sequenceS [msf'])
+
+#else
+
+{-# DEPRECATED widthFirst "This ListT definition is deprecated. Use the list-transformer variant of this function instead." #-}
+-- | Run an 'MSF' in the 'ListT' transformer (i.e., multiple MSFs producing
+-- each producing one output), by applying the input stream to each MSF in the
+-- list transformer and concatenating the outputs of the MSFs together.
+--
+-- An MSF in the ListT transformer can spawn into more than one MSF, or none,
+-- so the outputs produced at each individual step are not guaranteed to all
+-- have the same length.
+widthFirst :: (Functor m, Monad m) => MSF (ListT m) a b -> MSF m a [b]
+widthFirst msf = widthFirst' [msf]
+  where
+    widthFirst' msfs = MSF $ \a -> do
       (bs, msfs') <- unzip . concat <$> mapM (runListT . flip unMSF a) msfs
       return (bs, widthFirst' msfs')
 
+{-# DEPRECATED sequenceS "This ListT definition is deprecated. Use the list-transformer variant of this function instead." #-}
 -- | Build an 'MSF' in the 'ListT' transformer by broadcasting the input stream
 -- value to each MSF in a given list.
 sequenceS :: Monad m => [MSF m a b] -> MSF (ListT m) a b
@@ -66,6 +107,8 @@
     apply a msf = do
       (b, msf') <- unMSF msf a
       return (b, sequenceS [msf'])
+
+#endif
 
 -- | Apply an 'MSF' to every input.
 mapMSF :: Monad m => MSF m a b -> MSF m [a] [b]
