diff --git a/library/StmHamt/Hamt.hs b/library/StmHamt/Hamt.hs
--- a/library/StmHamt/Hamt.hs
+++ b/library/StmHamt/Hamt.hs
@@ -12,6 +12,7 @@
     reset,
     unfoldlM,
     listT,
+    listTNonAtomic,
   )
 where
 
@@ -124,6 +125,9 @@
 
 listT :: Hamt a -> ListT STM a
 listT = ListT.hamtElements
+
+listTNonAtomic :: Hamt a -> ListT IO a
+listTNonAtomic = ListT.hamtElementsNonAtomic
 
 null :: Hamt a -> STM Bool
 null (Hamt branchSsaVar) = do
diff --git a/library/StmHamt/ListT.hs b/library/StmHamt/ListT.hs
--- a/library/StmHamt/ListT.hs
+++ b/library/StmHamt/ListT.hs
@@ -9,10 +9,21 @@
 hamtElements :: Hamt a -> ListT STM a
 hamtElements (Hamt var) = tVarValue var >>= By6Bits.elementsListT >>= branchElements
 
+hamtElementsNonAtomic :: Hamt a -> ListT IO a
+hamtElementsNonAtomic (Hamt var) = tVarValueIO var >>= By6Bits.elementsListT >>= branchElementsNonAtomic
+
 branchElements :: Branch a -> ListT STM a
 branchElements = \case
   LeavesBranch _ array -> SmallArray.elementsListT array
   BranchesBranch hamt -> hamtElements hamt
 
+branchElementsNonAtomic :: Branch a -> ListT IO a
+branchElementsNonAtomic = \case
+  LeavesBranch _ array -> SmallArray.elementsListT array
+  BranchesBranch hamt -> hamtElementsNonAtomic hamt
+
 tVarValue :: TVar a -> ListT STM a
 tVarValue var = lift (readTVar var)
+
+tVarValueIO :: TVar a -> ListT IO a
+tVarValueIO var = lift (readTVarIO var)
diff --git a/stm-hamt.cabal b/stm-hamt.cabal
--- a/stm-hamt.cabal
+++ b/stm-hamt.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.0
-name:          stm-hamt
-version:       1.2.0.14
-synopsis:      STM-specialised Hash Array Mapped Trie
+name: stm-hamt
+version: 1.2.1
+synopsis: STM-specialised Hash Array Mapped Trie
 description:
   A low-level data-structure,
   which can be used to implement higher-level interfaces like
@@ -9,20 +9,18 @@
   Such implementations are presented by the
   <http://hackage.haskell.org/package/stm-containers stm-containers>.
 
-category:      Data Structures, STM, Concurrency
-homepage:      https://github.com/nikita-volkov/stm-hamt
-bug-reports:   https://github.com/nikita-volkov/stm-hamt/issues
-author:        Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer:    Nikita Volkov <nikita.y.volkov@mail.ru>
-copyright:     (c) 2016, Nikita Volkov
-license:       MIT
-license-file:  LICENSE
+category: Data Structures, STM, Concurrency
+homepage: https://github.com/nikita-volkov/stm-hamt
+bug-reports: https://github.com/nikita-volkov/stm-hamt/issues
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>
+copyright: (c) 2016, Nikita Volkov
+license: MIT
+license-file: LICENSE
 
 common base
-  default-language:   Haskell2010
+  default-language: Haskell2010
   default-extensions:
-    NoImplicitPrelude
-    NoMonomorphismRestriction
     Arrows
     BangPatterns
     BinaryLiterals
@@ -45,6 +43,8 @@
     MagicHash
     MultiParamTypeClasses
     MultiWayIf
+    NoImplicitPrelude
+    NoMonomorphismRestriction
     OverloadedStrings
     ParallelListComp
     PatternGuards
@@ -60,8 +60,8 @@
     UnboxedTuples
 
 library
-  import:          base
-  hs-source-dirs:  library
+  import: base
+  hs-source-dirs: library
   exposed-modules:
     StmHamt.Hamt
     StmHamt.SizedHamt
@@ -76,46 +76,50 @@
     StmHamt.UnfoldlM
 
   build-depends:
-    , base >=4.9 && <5
-    , deferred-folds >=0.9 && <0.10
-    , focus >=1 && <1.1
-    , hashable >=1.4.0.0 && <2
-    , list-t >=1.0.1 && <1.1
-    , primitive >=0.7 && <0.10
-    , primitive-extras >=0.10 && <0.11
-    , transformers >=0.5 && <0.7
+    base >=4.9 && <5,
+    deferred-folds >=0.9 && <0.10,
+    focus >=1 && <1.1,
+    hashable >=1.4.0.0 && <2,
+    list-t >=1.0.1 && <1.1,
+    primitive >=0.7 && <0.10,
+    primitive-extras >=0.10.2 && <0.11,
+    transformers >=0.5 && <0.7,
 
 test-suite test
-  import:         base
-  type:           exitcode-stdio-1.0
+  import: base
+  type: exitcode-stdio-1.0
   hs-source-dirs: test
-  main-is:        Main.hs
+  main-is: Main.hs
   other-modules:
     Main.Gens
     Main.Transaction
 
   build-depends:
-    , deferred-folds
-    , focus
-    , QuickCheck >=2.8.1 && <3
-    , quickcheck-instances >=0.3.11 && <0.4
-    , rerebase <2
-    , stm-hamt
-    , tasty >=0.12 && <2
-    , tasty-hunit >=0.9 && <0.11
-    , tasty-quickcheck >=0.9 && <0.11
+    QuickCheck >=2.8.1 && <3,
+    deferred-folds,
+    focus,
+    quickcheck-instances >=0.3.11 && <0.4,
+    rerebase <2,
+    stm-hamt,
+    tasty >=0.12 && <2,
+    tasty-hunit >=0.9 && <0.11,
+    tasty-quickcheck >=0.9 && <0.11,
 
 benchmark concurrent-insertion-bench
-  import:         base
-  type:           exitcode-stdio-1.0
+  import: base
+  type: exitcode-stdio-1.0
   hs-source-dirs: concurrent-insertion-bench
-  ghc-options:    -O2 -threaded -with-rtsopts=-N
-  main-is:        Main.hs
+  ghc-options:
+    -O2
+    -threaded
+    -with-rtsopts=-N
+
+  main-is: Main.hs
   build-depends:
-    , async >=2.0 && <3
-    , criterion >=1.5 && <1.7
-    , focus
-    , free >=4.5 && <6
-    , random >=1.2 && <2
-    , rebase <2
-    , stm-hamt
+    async >=2.0 && <3,
+    criterion >=1.5 && <1.7,
+    focus,
+    free >=4.5 && <6,
+    random >=1.2 && <2,
+    rebase <2,
+    stm-hamt,
diff --git a/test/Main/Transaction.hs b/test/Main/Transaction.hs
--- a/test/Main/Transaction.hs
+++ b/test/Main/Transaction.hs
@@ -8,7 +8,8 @@
 import qualified StmHamt.Hamt as StmHamt
 import Prelude
 
-data Transaction = forall result.
+data Transaction
+  = forall result.
   (Show result, Eq result) =>
   Transaction
   { name :: Text,
