diff --git a/library/StmHamt/Hamt.hs b/library/StmHamt/Hamt.hs
--- a/library/StmHamt/Hamt.hs
+++ b/library/StmHamt/Hamt.hs
@@ -11,7 +11,7 @@
   lookup,
   lookupExplicitly,
   reset,
-  unfoldM,
+  unfoldlM,
   listT,
 )
 where
@@ -20,7 +20,7 @@
 import StmHamt.Types
 import qualified Focus as Focus
 import qualified StmHamt.Focuses as Focus
-import qualified StmHamt.UnfoldMs as UnfoldMs
+import qualified StmHamt.UnfoldlM as UnfoldlM
 import qualified StmHamt.ListT as ListT
 import qualified StmHamt.IntOps as IntOps
 import qualified PrimitiveExtras.SmallArray as SmallArray
@@ -127,8 +127,8 @@
 reset :: Hamt a -> STM ()
 reset (Hamt branchSsaVar) = writeTVar branchSsaVar SparseSmallArray.empty
 
-unfoldM :: Hamt a -> UnfoldM STM a
-unfoldM = UnfoldMs.hamtElements
+unfoldlM :: Hamt a -> UnfoldlM STM a
+unfoldlM = UnfoldlM.hamtElements
 
 listT :: Hamt a -> ListT STM a
 listT = ListT.hamtElements
diff --git a/library/StmHamt/Prelude.hs b/library/StmHamt/Prelude.hs
--- a/library/StmHamt/Prelude.hs
+++ b/library/StmHamt/Prelude.hs
@@ -94,8 +94,8 @@
 
 -- deferred-folds
 -------------------------
-import DeferredFolds.Unfold as Exports (Unfold(..))
-import DeferredFolds.UnfoldM as Exports (UnfoldM(..))
+import DeferredFolds.Unfoldl as Exports (Unfoldl(..))
+import DeferredFolds.UnfoldlM as Exports (UnfoldlM(..))
 
 -- list-t
 -------------------------
diff --git a/library/StmHamt/SizedHamt.hs b/library/StmHamt/SizedHamt.hs
--- a/library/StmHamt/SizedHamt.hs
+++ b/library/StmHamt/SizedHamt.hs
@@ -13,7 +13,7 @@
   insert,
   lookup,
   reset,
-  unfoldM,
+  unfoldlM,
   listT,
 )
 where
@@ -26,34 +26,34 @@
 
 {-# INLINE new #-}
 new :: STM (SizedHamt element)
-new = SizedHamt <$> Hamt.new <*> newTVar 0
+new = SizedHamt <$> newTVar 0 <*> Hamt.new
 
 {-# INLINE newIO #-}
 newIO :: IO (SizedHamt element)
-newIO = SizedHamt <$> Hamt.newIO <*> newTVarIO 0
+newIO = SizedHamt <$> newTVarIO 0 <*> Hamt.newIO
 
 -- |
 -- /O(1)/.
 {-# INLINE null #-}
 null :: SizedHamt element -> STM Bool
-null (SizedHamt _ sizeVar) = (== 0) <$> readTVar sizeVar
+null (SizedHamt sizeVar _) = (== 0) <$> readTVar sizeVar
 
 -- |
 -- /O(1)/.
 {-# INLINE size #-}
 size :: SizedHamt element -> STM Int
-size (SizedHamt _ sizeVar) = readTVar sizeVar
+size (SizedHamt sizeVar _) = readTVar sizeVar
 
 {-# INLINE reset #-}
 reset :: SizedHamt element -> STM ()
-reset (SizedHamt hamt sizeVar) =
+reset (SizedHamt sizeVar hamt) =
   do
     Hamt.reset hamt
     writeTVar sizeVar 0
 
 {-# INLINE focus #-}
 focus :: (Eq key, Hashable key) => Focus element STM result -> (element -> key) -> key -> SizedHamt element -> STM result
-focus focus elementToKey key (SizedHamt hamt sizeVar) =
+focus focus elementToKey key (SizedHamt sizeVar hamt) =
   do
     (result, sizeModifier) <- Hamt.focus newFocus elementToKey key hamt
     forM_ sizeModifier (modifyTVar' sizeVar)
@@ -63,19 +63,19 @@
 
 {-# INLINE insert #-}
 insert :: (Eq key, Hashable key) => (element -> key) -> element -> SizedHamt element -> STM ()
-insert elementToKey element (SizedHamt hamt sizeVar) =
+insert elementToKey element (SizedHamt sizeVar hamt) =
   do
     inserted <- Hamt.insert elementToKey element hamt
     when inserted (modifyTVar' sizeVar succ)
 
 {-# INLINE lookup #-}
 lookup :: (Eq key, Hashable key) => (element -> key) -> key -> SizedHamt element -> STM (Maybe element)
-lookup elementToKey key (SizedHamt hamt _) = Hamt.lookup elementToKey key hamt
+lookup elementToKey key (SizedHamt _ hamt) = Hamt.lookup elementToKey key hamt
 
-{-# INLINE unfoldM #-}
-unfoldM :: SizedHamt a -> UnfoldM STM a
-unfoldM (SizedHamt hamt _) = Hamt.unfoldM hamt
+{-# INLINE unfoldlM #-}
+unfoldlM :: SizedHamt a -> UnfoldlM STM a
+unfoldlM (SizedHamt _ hamt) = Hamt.unfoldlM hamt
 
 {-# INLINE listT #-}
 listT :: SizedHamt a -> ListT STM a
-listT (SizedHamt hamt _) = Hamt.listT hamt
+listT (SizedHamt _ hamt) = Hamt.listT hamt
diff --git a/library/StmHamt/Types.hs b/library/StmHamt/Types.hs
--- a/library/StmHamt/Types.hs
+++ b/library/StmHamt/Types.hs
@@ -8,7 +8,7 @@
 extended with its size-tracking functionality,
 allowing for a fast 'size' operation.
 -}
-data SizedHamt element = SizedHamt !(Hamt element) !(TVar Int)
+data SizedHamt element = SizedHamt !(TVar Int) !(Hamt element)
 
 {-|
 STM-specialized Hash Array Mapped Trie.
diff --git a/library/StmHamt/UnfoldMs.hs b/library/StmHamt/UnfoldMs.hs
deleted file mode 100644
--- a/library/StmHamt/UnfoldMs.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module StmHamt.UnfoldMs where
-
-import StmHamt.Prelude hiding (filter, all)
-import StmHamt.Types
-import DeferredFolds.UnfoldM
-import qualified PrimitiveExtras.SmallArray as SmallArray
-import qualified PrimitiveExtras.SparseSmallArray as SparseSmallArray
-
-
-hamtElements :: Hamt a -> UnfoldM STM a
-hamtElements (Hamt var) = tVarValue var >>= SparseSmallArray.elementsUnfoldM >>= branchElements
-
-branchElements :: Branch a -> UnfoldM STM a
-branchElements = \ case
-  LeavesBranch _ array -> SmallArray.elementsUnfoldM array
-  BranchesBranch hamt -> hamtElements hamt
diff --git a/library/StmHamt/UnfoldlM.hs b/library/StmHamt/UnfoldlM.hs
new file mode 100644
--- /dev/null
+++ b/library/StmHamt/UnfoldlM.hs
@@ -0,0 +1,16 @@
+module StmHamt.UnfoldlM where
+
+import StmHamt.Prelude hiding (filter, all)
+import StmHamt.Types
+import DeferredFolds.UnfoldlM
+import qualified PrimitiveExtras.SmallArray as SmallArray
+import qualified PrimitiveExtras.SparseSmallArray as SparseSmallArray
+
+
+hamtElements :: Hamt a -> UnfoldlM STM a
+hamtElements (Hamt var) = tVarValue var >>= SparseSmallArray.elementsUnfoldlM >>= branchElements
+
+branchElements :: Branch a -> UnfoldlM STM a
+branchElements = \ case
+  LeavesBranch _ array -> SmallArray.elementsUnfoldlM array
+  BranchesBranch hamt -> hamtElements hamt
diff --git a/stm-hamt.cabal b/stm-hamt.cabal
--- a/stm-hamt.cabal
+++ b/stm-hamt.cabal
@@ -1,5 +1,5 @@
 name: stm-hamt
-version: 1.1.2.1
+version: 1.2
 synopsis: STM-specialised Hash Array Mapped Trie
 description:
   A low-level data-structure,
@@ -31,16 +31,16 @@
     StmHamt.Focuses
     StmHamt.Prelude
     StmHamt.Types
-    StmHamt.UnfoldMs
+    StmHamt.UnfoldlM
     StmHamt.ListT
   build-depends:
     base >=4.9 && <5,
-    deferred-folds >=0.6.5 && <0.7,
+    deferred-folds >=0.7 && <0.8,
     focus >=1 && <1.1,
     hashable <2,
     list-t >=1.0.1 && <1.1,
     primitive >=0.6.4 && <0.7,
-    primitive-extras >=0.6.7 && <0.7,
+    primitive-extras >=0.7 && <0.8,
     transformers >=0.5 && <0.6
 
 test-suite test
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -15,7 +15,7 @@
 import qualified StmHamt.Hamt as Hamt
 import qualified Data.HashMap.Strict as HashMap
 import qualified Focus
-import qualified DeferredFolds.UnfoldM as UnfoldM
+import qualified DeferredFolds.UnfoldlM as UnfoldlM
 
 
 main =
@@ -40,7 +40,7 @@
       hamtToListInIo hamt =
         fmap reverse $
         atomically $
-        UnfoldM.foldlM' (\ state element -> return (element : state)) [] (Hamt.unfoldM hamt)
+        UnfoldlM.foldlM' (\ state element -> return (element : state)) [] (Hamt.unfoldlM hamt)
 
       listToListThruHamtInIo :: (Eq key, Hashable key, Eq value) => [(key, value)] -> IO [(key, value)]
       listToListThruHamtInIo = hamtFromListUsingInsertInIo >=> hamtToListInIo
@@ -203,7 +203,7 @@
                       -- traceM =<< atomically (Hamt.introspect hamt)
                       result2 <- atomically $ applyToStmHamt hamt
                       -- traceM =<< atomically (Hamt.introspect hamt)
-                      list <- atomically $ UnfoldM.foldlM' (\ state element -> return (element : state)) [] (Hamt.unfoldM hamt)
+                      list <- atomically $ UnfoldlM.foldlM' (\ state element -> return (element : state)) [] (Hamt.unfoldlM hamt)
                       return (result2, sort list)
                     in
                       -- trace ("-----") $
