diff --git a/.hlint.yaml b/.hlint.yaml
--- a/.hlint.yaml
+++ b/.hlint.yaml
@@ -1,4 +1,4 @@
-- arguments: [--cpp-define=HLINT, --cpp-ansi]
+- arguments: [-XCPP, --cpp-define=HLINT, --cpp-ansi]
 
 - ignore: {name: Reduce duplication}
 - ignore: {name: Redundant lambda}
diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+## 0.2.6 [2022.05.18]
+---------------------
+* Make the `IncCounterExperiment` benchmark compile with GHC 9.4.
+
 ## 0.2.5 [2021.02.17]
 ---------------------
 * The build-type has been changed from `Custom` to `Simple`.
diff --git a/examples/IncCounterExperiment.hs b/examples/IncCounterExperiment.hs
--- a/examples/IncCounterExperiment.hs
+++ b/examples/IncCounterExperiment.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE MagicHash #-}
 {-# LANGUAGE UnboxedTuples #-}
 -----------------------------------------------------------------------------
@@ -54,15 +55,25 @@
 incCounterAtomic :: Counter -> IO Word64
 incCounterAtomic (Counter (MutableByteArray c)) = primitive $ \ s ->
   case fetchAddIntArray# c 0# 2# s of
-       (# s', r #) -> (# s', W64# (int2Word# r) #)
+       (# s', r #) ->
+#if MIN_VERSION_base(4,17,0)
+         (# s', W64# (wordToWord64# (int2Word# r)) #)
+#else
+         (# s', W64# (int2Word# r) #)
+#endif
 {-# INLINE incCounterAtomic #-}
 
 incCounterNonAtomicFancy :: Counter -> IO Word64
 incCounterNonAtomicFancy (Counter (MutableByteArray c)) = primitive $ \ s ->
   case readWord64Array# c 0# s of
-       (# s', r #) -> case plusWord# r (int2Word# 2#) of
-                           r' -> case writeWord64Array# c 0# r' s' of
-                                      s'' -> (# s'', W64# r' #)
+       (# s', r #) ->
+#if MIN_VERSION_base(4,17,0)
+         case plusWord64# r (wordToWord64# 2##) of
+#else
+         case plusWord# r 2## of
+#endif
+              r' -> case writeWord64Array# c 0# r' s' of
+                         s'' -> (# s'', W64# r' #)
 {-# INLINE incCounterNonAtomicFancy #-}
 
 incCounterNonAtomic :: Counter -> IO Word64
diff --git a/examples/TimeSynchronize.hs b/examples/TimeSynchronize.hs
--- a/examples/TimeSynchronize.hs
+++ b/examples/TimeSynchronize.hs
@@ -77,9 +77,9 @@
 writer n m = do
 #if MEASURE_SYNCHRONIZE
   helper n m timeZero
-  where helper 0  _ !acc = return acc
-        helper !n m !acc = do d <- m
-                              helper (pred n) m (acc + d)
+  where helper 0   _  !acc = return acc
+        helper !n' m' !acc = do d <- m'
+                                helper (pred n') m' (acc + d)
 #else
   replicateM_ n m
   return timeZero
@@ -191,7 +191,7 @@
   let aud = wtd / fromIntegral nUpdates
   putStrLn $ "average writer update time: " ++ show aud
 #if MEASURE_SYNCHRONIZE
-  putStrLn $ "average synchronize time: " ++ show wfrd
+  putStrLn $ "average synchronize time: " ++ show _wfrd
 #endif
   where opts = info optsParser
              ( fullDesc
diff --git a/rcu.cabal b/rcu.cabal
--- a/rcu.cabal
+++ b/rcu.cabal
@@ -1,6 +1,6 @@
 name:          rcu
 category:      Data
-version:       0.2.5
+version:       0.2.6
 license:       BSD3
 cabal-version: 1.22
 license-file:  LICENSE
@@ -16,8 +16,10 @@
              , GHC == 8.2.2
              , GHC == 8.4.4
              , GHC == 8.6.5
-             , GHC == 8.8.3
-             , GHC == 8.10.1
+             , GHC == 8.8.4
+             , GHC == 8.10.7
+             , GHC == 9.0.2
+             , GHC == 9.2.2
 synopsis:      Read-Copy-Update for Haskell
 description:   Read-Copy-Update for Haskell.
 
@@ -50,7 +52,7 @@
     ghc-prim >= 0.3,
     parallel >= 3.2 && < 3.3,
     primitive >= 0.6,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   exposed-modules:
     Control.Concurrent.RCU.Class
@@ -132,7 +134,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=QSBR -DBENCHMARKS -DMEASURE_SYNCHRONIZE
@@ -159,7 +161,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=GC -DBENCHMARKS -DMEASURE_SYNCHRONIZE
@@ -186,7 +188,7 @@
     primitive >= 0.6,
     rcu,
     time >= 1.5.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=QSBR -DBENCHMARKS -DUNBOUND -DMEASURE_SYNCHRONIZE
@@ -213,7 +215,7 @@
     primitive >= 0.6,
     rcu,
     time >= 1.5.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=GC -DBENCHMARKS -DUNBOUND -DMEASURE_SYNCHRONIZE
@@ -240,7 +242,7 @@
     primitive >= 0.6,
     rcu,
     time >= 1.5.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=QSBR -DBENCHMARKS -DUNBOUND -DMEASURE_SYNCHRONIZE
@@ -267,7 +269,7 @@
     primitive >= 0.6,
     rcu,
     time >= 1.5.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=GC -DBENCHMARKS -DUNBOUND -DMEASURE_SYNCHRONIZE
@@ -294,7 +296,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=QSBR -DBENCHMARKS -DMEASURE_SYNCHRONIZE
@@ -321,7 +323,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=GC -DBENCHMARKS -DMEASURE_SYNCHRONIZE
@@ -348,7 +350,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=QSBR -DBENCHMARKS -DMEASURE_SYNCHRONIZE
@@ -375,7 +377,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=GC -DBENCHMARKS -DMEASURE_SYNCHRONIZE
@@ -402,7 +404,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=QSBR -DBENCHMARKS -DMEASURE_SYNCHRONIZE
@@ -429,7 +431,7 @@
     primitive >= 0.6,
     rcu,
     rdtsc >= 1.3.0.1,
-    transformers >= 0.4 && < 0.6
+    transformers >= 0.4 && < 0.7
 
   if flag(measure-synchronize)
     cpp-options: -DMODE=GC -DBENCHMARKS -DMEASURE_SYNCHRONIZE
diff --git a/src/Control/Concurrent/RCU/Class.hs b/src/Control/Concurrent/RCU/Class.hs
--- a/src/Control/Concurrent/RCU/Class.hs
+++ b/src/Control/Concurrent/RCU/Class.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE Safe #-}
 {-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE DefaultSignatures #-}
diff --git a/src/Control/Concurrent/RCU/GC/Internal.hs b/src/Control/Concurrent/RCU/GC/Internal.hs
--- a/src/Control/Concurrent/RCU/GC/Internal.hs
+++ b/src/Control/Concurrent/RCU/GC/Internal.hs
@@ -47,7 +47,7 @@
 import Control.Parallel
 import Data.Atomics
 import Data.IORef
-import Data.List
+import qualified Data.List as L
 import Data.Primitive
 import Prelude hiding (Read(..))
 import System.Mem
@@ -135,10 +135,12 @@
   ReadingRCU mf <*> ReadingRCU ma = ReadingRCU $ \ s -> mf s <*> ma s
 
 instance Monad (ReadingRCU s) where
-  return a = ReadingRCU $ \ _ -> pure a
   ReadingRCU m >>= f = ReadingRCU $ \ s -> do
     a <- m s
     runReadingRCU (f a) s
+#if !(MIN_VERSION_base(4,11,0))
+  return a = ReadingRCU $ \ _ -> pure a
+#endif
 #if !(MIN_VERSION_base(4,13,0))
   fail = Fail.fail
 #endif
@@ -174,10 +176,12 @@
   WritingRCU mf <*> WritingRCU ma = WritingRCU $ \ s -> mf s <*> ma s
 
 instance Monad (WritingRCU s) where
-  return a = WritingRCU $ \ _ -> pure a
   WritingRCU m >>= f = WritingRCU $ \ s -> do
     a <- m s
     runWritingRCU (f a) s
+#if !(MIN_VERSION_base(4,11,0))
+  return a = WritingRCU $ \ _ -> pure a
+#endif
 #if !(MIN_VERSION_base(4,13,0))
   fail = Fail.fail
 #endif
@@ -258,11 +262,13 @@
   deriving Functor
 
 instance Applicative (RCU s) where
-  pure = return
+  pure a = RCU $ \ _ -> return a
   (<*>) = ap
 
 instance Monad (RCU s) where
+#if !(MIN_VERSION_base(4,11,0))
   return a = RCU $ \ _ -> return a
+#endif
   RCU m >>= f = RCU $ \s -> do
     a <- m s
     unRCU (f a) s
@@ -289,7 +295,7 @@
     tid <- forkIO $ do
       x <- m $ s { rcuStateMyCounter = threadCounter }
       putMVar result x
-      modifyMVar_ (rcuStateThreadCountersV s) $ return . delete threadCounter
+      modifyMVar_ (rcuStateThreadCountersV s) $ return . L.delete threadCounter
     return (RCUThread tid result)
   {-# INLINE forking #-}
 
diff --git a/src/Control/Concurrent/RCU/QSBR/Internal.hs b/src/Control/Concurrent/RCU/QSBR/Internal.hs
--- a/src/Control/Concurrent/RCU/QSBR/Internal.hs
+++ b/src/Control/Concurrent/RCU/QSBR/Internal.hs
@@ -50,7 +50,7 @@
 import Control.Parallel
 import Data.Atomics
 import Data.IORef
-import Data.List
+import qualified Data.List as L
 import Data.Primitive
 import Foreign
 import qualified Control.Monad.Fail as Fail
@@ -146,10 +146,12 @@
   ReadingRCU mf <*> ReadingRCU ma = ReadingRCU $ \ s -> mf s <*> ma s
 
 instance Monad (ReadingRCU s) where
-  return a = ReadingRCU $ \ _ -> pure a
   ReadingRCU m >>= f = ReadingRCU $ \ s -> do
     a <- m s
     runReadingRCU (f a) s
+#if !(MIN_VERSION_base(4,11,0))
+  return a = ReadingRCU $ \ _ -> pure a
+#endif
 #if !(MIN_VERSION_base(4,13,0))
   fail = Fail.fail
 #endif
@@ -185,10 +187,12 @@
   WritingRCU mf <*> WritingRCU ma = WritingRCU $ \ s -> mf s <*> ma s
 
 instance Monad (WritingRCU s) where
-  return a = WritingRCU $ \ _ -> pure a
   WritingRCU m >>= f = WritingRCU $ \ s -> do
     a <- m s
     runWritingRCU (f a) s
+#if !(MIN_VERSION_base(4,11,0))
+  return a = WritingRCU $ \ _ -> pure a
+#endif
 #if !(MIN_VERSION_base(4,13,0))
   fail = Fail.fail
 #endif
@@ -265,11 +269,13 @@
   deriving Functor
 
 instance Applicative (RCU s) where
-  pure = return
+  pure a = RCU $ \ _ -> return a
   (<*>) = ap
 
 instance Monad (RCU s) where
+#if !(MIN_VERSION_base(4,11,0))
   return a = RCU $ \ _ -> return a
+#endif
   RCU m >>= f = RCU $ \s -> do
     a <- m s
     unRCU (f a) s
@@ -310,7 +316,7 @@
       -- and remove this counter from the list writers poll.
       writeBarrier
       writeCounter threadCounter offline
-      withMVar rcuStateThreadCountersLockV $ \ _ -> writeSRefIO rcuStateThreadCountersR . delete threadCounter =<< readSRefIO rcuStateThreadCountersR
+      withMVar rcuStateThreadCountersLockV $ \ _ -> writeSRefIO rcuStateThreadCountersR . L.delete threadCounter =<< readSRefIO rcuStateThreadCountersR
     return (RCUThread tid result)
   {-# INLINE forking #-}
 
diff --git a/unstable/Control/Concurrent/RCU/STM/Internal.hs b/unstable/Control/Concurrent/RCU/STM/Internal.hs
--- a/unstable/Control/Concurrent/RCU/STM/Internal.hs
+++ b/unstable/Control/Concurrent/RCU/STM/Internal.hs
@@ -80,7 +80,9 @@
   WritingRCU mf <*> WritingRCU ma = WritingRCU $ \c -> mf c <*> ma c
 
 instance Monad (WritingRCU s) where
-  return a = WritingRCU $ \ _ -> pure a
+#if !(MIN_VERSION_base(4,11,0))
+  return = pure
+#endif
   WritingRCU m >>= f = WritingRCU $ \ c -> do
     a <- m c
     runWritingRCU (f a) c
@@ -122,11 +124,13 @@
   deriving Functor
 
 instance Applicative (RCU s) where
-  pure = return
+  pure a = RCU $ \ _ -> pure a
   (<*>) = ap
 
 instance Monad (RCU s) where
-  return a = RCU $ \ _ -> return a
+#if !(MIN_VERSION_base(4,11,0))
+  return = pure
+#endif
   RCU m >>= f = RCU $ \s -> do
     a <- m s
     unRCU (f a) s
