diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for inspection-testing
 
+## 0.5.0.1 -- 2023-01-15
+
+* Support mtl-2.3 and GHC 9.6 (thanks Bodigrim)
+
 ## 0.5 -- 2022-06-15
 
 * New equivalence `==~` that accepts different order of bindings in lets. (thanks @phadej)
diff --git a/inspection-testing.cabal b/inspection-testing.cabal
--- a/inspection-testing.cabal
+++ b/inspection-testing.cabal
@@ -1,5 +1,5 @@
 name:                inspection-testing
-version:             0.5
+version:             0.5.0.1
 synopsis:            GHC plugin to do inspection testing
 description:         Some carefully crafted libraries make promises to their
                      users beyond functionality and performance.
@@ -34,7 +34,7 @@
 build-type:          Simple
 extra-source-files:  ChangeLog.md, README.md
 cabal-version:       >=1.10
-Tested-With:         GHC == 8.0.2, GHC == 8.2.*, GHC == 8.4.*, GHC ==8.6.*, GHC ==8.8.*, GHC ==8.10.*, GHC ==9.0.*, GHC ==9.2.*, GHC ==9.4.*
+Tested-With:         GHC == 8.0.2, GHC == 8.2.*, GHC == 8.4.*, GHC ==8.6.*, GHC ==8.8.*, GHC ==8.10.*, GHC ==9.0.*, GHC ==9.2.*, GHC ==9.4.*, GHC ==9.6.*
 
 source-repository head
   type:     git
@@ -45,8 +45,8 @@
                        Test.Inspection.Plugin
                        Test.Inspection.Core
   hs-source-dirs:      src
-  build-depends:       base >=4.9 && <4.18
-  build-depends:       ghc >= 8.0.2 && <9.5
+  build-depends:       base >=4.9 && <4.19
+  build-depends:       ghc >= 8.0.2 && <9.7
   build-depends:       template-haskell
   build-depends:       containers
   build-depends:       transformers
diff --git a/src/Test/Inspection.hs b/src/Test/Inspection.hs
--- a/src/Test/Inspection.hs
+++ b/src/Test/Inspection.hs
@@ -81,6 +81,8 @@
 -- mnemonic convenience functions like '(===)' or 'hasNoType'.
 --
 -- The obligation needs to be passed to 'inspect' or 'inspectTest'.
+--
+-- @since 0.1
 data Obligation = Obligation
     { target      :: Name
         -- ^ The target of a test obligation; invariably the name of a local
@@ -99,10 +101,14 @@
     , storeResult :: Maybe String
         -- ^ If this is 'Nothing', then report errors during compilation.
         -- Otherwise, update the top-level definition with this name.
+        --
+        -- @since 0.2
     }
     deriving Data
 
 -- | Properties of the obligation target to be checked.
+--
+-- @since 0.1
 data Property
     -- | Are the two functions equal?
     --
@@ -118,22 +124,32 @@
 
     -- | Do none of these types appear anywhere in the definition of the function
     -- (neither locally bound nor passed as arguments)
+    --
+    -- @since 0.3
     | NoTypes [Name]
 
     -- | Does this function perform no heap allocations.
     | NoAllocation
 
     -- | Does this value contain dictionaries (/except/ of the listed classes).
+    --
+    -- @since 0.3
     | NoTypeClasses [Name]
 
     -- | Does not contain this value (in terms or patterns)
+    --
+    -- @since 0.4.1
     | NoUseOf [Name]
 
     -- | Always satisfied, but dumps the value in non-quiet mode.
+    --
+    -- @since 0.4.2
     | CoreOf
     deriving Data
 
 -- | Equivalence of terms.
+--
+-- @since 0.5
 data Equivalence
     = StrictEquiv               -- ^ strict term equality
     | IgnoreTypesAndTicksEquiv  -- ^ ignore types and hpc ticks during the comparison
@@ -142,6 +158,8 @@
 
 -- | Creates an inspection obligation for the given function name
 -- with default values for the optional fields.
+--
+-- @since 0.1
 mkObligation :: Name -> Property -> Obligation
 mkObligation target prop = Obligation
     { target = target
@@ -158,6 +176,8 @@
 -}
 
 -- | Declare two functions to be equal (see 'EqualTo')
+--
+-- @since 0.1
 (===) :: Name -> Name -> Obligation
 (===) = mkEquality False StrictEquiv
 infix 9 ===
@@ -165,30 +185,40 @@
 -- | Declare two functions to be equal, but ignoring
 -- type lambdas, type arguments, type casts and hpc ticks (see 'EqualTo').
 -- Note that @-fhpc@ can prevent some optimizations; build without for more reliable analysis.
+--
+-- @since 0.1.1
 (==-) :: Name -> Name -> Obligation
 (==-) = mkEquality False IgnoreTypesAndTicksEquiv
 infix 9 ==-
 
 -- | Declare two functions to be equal as @('==-')@ but also ignoring
 -- let bindings ordering (see 'EqualTo').
+--
+-- @since 0.5
 (==~) :: Name -> Name -> Obligation
 (==~) = mkEquality False UnorderedLetsEquiv
 infix 9 ==~
 
 -- | Declare two functions to be equal, but expect the test to fail (see 'EqualTo' and 'expectFail')
 -- (This is useful for documentation purposes, or as a TODO list.)
+--
+-- @since 0.1
 (=/=) :: Name -> Name -> Obligation
 (=/=) = mkEquality True StrictEquiv
 infix 9 =/=
 
 -- | Declare two functions to be equal up to types (see '(==-)'),
--- but expect the test to fail (see 'expectFail'),
+-- but expect the test to fail (see 'expectFail').
+--
+-- @since 0.4.3.0
 (=/-) :: Name -> Name -> Obligation
 (=/-) = mkEquality False IgnoreTypesAndTicksEquiv
 infix 9 =/-
 
 -- | Declare two functions to be equal up to let binding ordering (see '(==~)'),
--- but expect the test to fail (see 'expectFail'),
+-- but expect the test to fail (see 'expectFail').
+--
+-- @since 0.5
 (=/~) :: Name -> Name -> Obligation
 (=/~) = mkEquality False UnorderedLetsEquiv
 infix 9 =/~
@@ -204,6 +234,8 @@
 -- pattern-bound) has a type that contains the given type constructor.
 --
 -- @'inspect' $ fusedFunction ``hasNoType`` ''[]@
+--
+-- @since 0.1
 hasNoType :: Name -> Name -> Obligation
 hasNoType n tn = mkObligation n (NoTypes [tn])
 
@@ -212,6 +244,8 @@
 -- "GHC.Generics".
 --
 -- @inspect $ hasNoGenerics genericFunction@
+--
+-- @since 0.3
 hasNoGenerics :: Name -> Obligation
 hasNoGenerics n =
     mkObligation n
@@ -225,12 +259,16 @@
 -- pattern-bound) has a type that contains a type that mentions a type class.
 --
 -- @'inspect' $ 'hasNoTypeClasses' specializedFunction@
+--
+-- @since 0.3
 hasNoTypeClasses :: Name -> Obligation
 hasNoTypeClasses n = hasNoTypeClassesExcept n []
 
 -- | A variant of 'hasNoTypeClasses', which white-lists some type-classes.
 --
 -- @'inspect' $ fieldLens ``hasNoTypeClassesExcept`` [''Functor]@
+--
+-- @since 0.3
 hasNoTypeClassesExcept :: Name -> [Name] -> Obligation
 hasNoTypeClassesExcept n tns = mkObligation n (NoTypeClasses tns)
 
@@ -238,6 +276,8 @@
 -- variable (either in terms or -- if it is a constructor -- in patterns).
 --
 -- @'inspect' $ foo ``doesNotUse`` 'error@
+--
+-- @since 0.4.1
 doesNotUse :: Name -> Name -> Obligation
 doesNotUse n ns = mkObligation n (NoUseOf [ns])
 
@@ -247,6 +287,7 @@
 --
 -- This is useful when you need to inspect some values manually.
 --
+-- @since 0.4.2
 coreOf :: Name -> Obligation
 coreOf n = mkObligation n CoreOf
 
@@ -264,10 +305,14 @@
 -- | As seen in the example above, the entry point to inspection testing is the
 -- 'inspect' function, to which you pass an 'Obligation'.
 -- It will report test failures at compile time.
+--
+-- @since 0.1
 inspect :: Obligation -> Q [Dec]
 inspect = inspectCommon ModuleAnnotation
 
 -- | The result of 'inspectTest', which has a more or less helpful text message
+--
+-- @since 0.2
 data Result = Failure String | Success String
     deriving Show
 
@@ -282,6 +327,8 @@
 -- This variant ignores the 'expectFail' field of the obligation. Instead,
 -- it is expected that you use the corresponding functionality in your test
 -- framework (e.g. [@tasty-expected-failure@](https://hackage.haskell.org/package/tasty-expected-failure))
+--
+-- @since 0.2
 inspectTest :: Obligation -> Q Exp
 inspectTest obl = do
     nameS <- genName
diff --git a/src/Test/Inspection/Core.hs b/src/Test/Inspection/Core.hs
--- a/src/Test/Inspection/Core.hs
+++ b/src/Test/Inspection/Core.hs
@@ -54,8 +54,14 @@
 import GHC.Types.Tickish
 #endif
 
+#if MIN_VERSION_ghc(9,6,0)
+import GHC.Core.TyCo.Compare (eqTypeX)
+#endif
+
 import qualified Data.Set as S
-import Control.Monad.State.Strict
+import Control.Monad (guard, unless, mzero)
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.State.Strict (StateT, runStateT, execState, modify, modify', put, get, gets)
 import Data.List (nub, intercalate)
 import Data.Maybe
 
