diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for recover-rtti
 
+## 0.4.2 -- 2023-03-23
+
+* Support mtl 2.3 (requiring at least 2.3.1) (#26).
+  Thanks to Rebecca Turner.
+
 ## 0.4.1 -- 2022-03-17
 
 * Support for ghc 9.2, bytestring 0.11, aeson 0.2
diff --git a/recover-rtti.cabal b/recover-rtti.cabal
--- a/recover-rtti.cabal
+++ b/recover-rtti.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               recover-rtti
-version:            0.4.1.0
+version:            0.4.2
 synopsis:           Recover run-time type information from the GHC heap
 description:        The main function in this package is 'classify', which looks
                     at the GHC heap to recover type information about arbitrary
@@ -45,23 +45,26 @@
                       Debug.RecoverRTTI.Util
                       Debug.RecoverRTTI.Wrappers
 
-    build-depends:    base                 >= 4.13     && < 4.17
-                    , aeson                >= 1.4      && < 2.1
-                    , bytestring           >= 0.10     && < 0.12
-                    , containers           >= 0.6      && < 0.7
-                    , ghc-heap             >= 8.8      && < 9.3
-                    , mtl                  >= 2.2      && < 2.3
-                    , sop-core             >= 0.5      && < 0.6
-                    , stm                  >= 2.5      && < 2.6
-                    , text                 >= 1.2      && < 2.1
+    build-depends:    base       >= 4.13 && < 4.17
+                    , aeson      >= 1.4  && < 2.1
+                    , bytestring >= 0.10 && < 0.12
+                    , containers >= 0.6  && < 0.7
+                    , ghc-heap   >= 8.8  && < 9.3
+                    , sop-core   >= 0.5  && < 0.6
+                    , stm        >= 2.5  && < 2.6
+                    , text       >= 1.2  && < 2.1
+
+                      -- mtl 2.3 does not have ExceptT?
+                    , mtl (>= 2.2 && < 2.3) || (>= 2.3.1 && < 2.4)
+
                       -- 0.2.12 introduces Data.HashMap.Internal.Array
-                    , unordered-containers >= 0.2.12   && < 0.3
+                    , unordered-containers >= 0.2.12 && < 0.3
 
                       -- The oldest ghc we support is 8.8.
                       -- The dependencies below are the oldest versions of
                       -- these packages that compile with this ghc version.
-                    , vector               >= 0.12.1.2 && < 0.13
-                    , primitive            >= 0.7      && < 0.8
+                    , vector    >= 0.12.1.2 && < 0.13
+                    , primitive >= 0.7      && < 0.8
 
     hs-source-dirs:   src
     default-language: Haskell2010
diff --git a/src/Debug/RecoverRTTI/Classify.hs b/src/Debug/RecoverRTTI/Classify.hs
--- a/src/Debug/RecoverRTTI/Classify.hs
+++ b/src/Debug/RecoverRTTI/Classify.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
@@ -36,6 +37,7 @@
   , pattern ElemUK
   ) where
 
+import Control.Monad
 import Control.Monad.Except
 import Data.HashMap.Lazy (HashMap)
 import Data.IntMap (IntMap)
@@ -50,6 +52,10 @@
 import GHC.Real
 import System.IO.Unsafe (unsafePerformIO)
 import Unsafe.Coerce (unsafeCoerce)
+
+#if MIN_VERSION_mtl(2,3,0)
+import Control.Monad.Trans
+#endif
 
 import qualified Data.Foldable               as Foldable
 import qualified Data.HashMap.Internal.Array as HashMap (Array)
