diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,19 +1,24 @@
 # Changelog for polysemy-mocks
 
+## 0.3.1.0
+
+* Support template-haskell-2.18.0 (and so GHC 9.2).
+* Test compatibility with GHC 9.4.
+
 ## 0.3.0.0
 
-* Support template-haskell-2.17.0 (and so GHC 9.0)
+* Support template-haskell-2.17.0 (and so GHC 9.0).
 * Add 'HasCallStack' constraint to 'evalMocks', {run,eval,exec}Mock and default
   implementations for the "returns" functions (which throws error, by default).
   'RankNTypes' is now needed to use the TH mocks.
 
 ## 0.2.0.0
 
-* Support polysemy >= 1.7, drop support for older versions
+* Support polysemy >= 1.7, drop support for older versions.
 
 ## 0.1.0.1
 
-* Better docs
+* Better docs.
 
 ## 0.1.0.0
 
diff --git a/polysemy-mocks.cabal b/polysemy-mocks.cabal
--- a/polysemy-mocks.cabal
+++ b/polysemy-mocks.cabal
@@ -1,7 +1,7 @@
 cabal-version: 1.12
 
 name:           polysemy-mocks
-version:        0.3.0.0
+version:        0.3.1.0
 description:    Please see the README on GitHub at <https://github.com/akshaymankar/polysemy-mocks#readme>
 homepage:       https://github.com/akshaymankar/polysemy-mocks#readme
 bug-reports:    https://github.com/akshaymankar/polysemy-mocks/issues
diff --git a/src/Test/Polysemy/Mock/TH.hs b/src/Test/Polysemy/Mock/TH.hs
--- a/src/Test/Polysemy/Mock/TH.hs
+++ b/src/Test/Polysemy/Mock/TH.hs
@@ -110,7 +110,11 @@
 
 mkMockMatch :: Type -> ConLiftInfo -> Match
 mkMockMatch t c =
+#if MIN_VERSION_template_haskell(2,18,0)
+  let pat = ConP (cliConName c) [] (map (VarP . fst) (cliFunArgs c))
+#else
   let pat = ConP (cliConName c) (map (VarP . fst) (cliFunArgs c))
+#endif
       sendFn = VarE 'send
       args = map (VarE . fst) (cliFunArgs c)
       theMock = foldl' AppE (ConE $ mockConName c) args
@@ -126,7 +130,11 @@
 {- ORMOLU_DISABLE -}
 mkMockToStateMatch :: Type -> ConLiftInfo -> Match
 mkMockToStateMatch t c =
+#if MIN_VERSION_template_haskell(2,18,0)
+  let pat = ConP (mockConName c) [] (map VarP vars)
+#else
   let pat = ConP (mockConName c) (map VarP vars)
+#endif
       --
       vars = map fst (cliFunArgs c)
       newArgs = if length (cliFunArgs c) == 1
@@ -159,7 +167,11 @@
 mkReturnsToStateMatch :: Type -> ConLiftInfo -> Match
 mkReturnsToStateMatch t c =
   let f = mkName "f"
+#if MIN_VERSION_template_haskell(2,18,0)
+      pat = ConP (returnsConName c) [] [VarP f]
+#else
       pat = ConP (returnsConName c) [VarP f]
+#endif
       newState = RecUpdE (VarE stateName) [(returnsFieldName c, VarE f)]
       returnNothing = NoBindS $ AppE (VarE 'pureT) (TupE [])
       body =
@@ -175,7 +187,11 @@
 
 mkCallsToStateMatch :: Type -> ConLiftInfo -> Match
 mkCallsToStateMatch t c =
+#if MIN_VERSION_template_haskell(2,18,0)
+  let pat = ConP (callsConName c) [] []
+#else
   let pat = ConP (callsConName c) []
+#endif
       returnCalls = NoBindS $ AppE (VarE 'pureT) (AppE (VarE (callsFieldName c)) (VarE stateName))
       body =
         NormalB
