diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
 # Revsion history of io-sim
 
-## next version
+## 1.0.0.1
+
+### Non breaking changes
+
+* Support `ghc-9.6`.
 
 ## 1.0.0.0
 
diff --git a/io-sim.cabal b/io-sim.cabal
--- a/io-sim.cabal
+++ b/io-sim.cabal
@@ -1,6 +1,6 @@
 cabal-version:       3.0
 name:                io-sim
-version:             1.0.0.0
+version:             1.0.0.1
 synopsis:            A pure simulator for monadic concurrency with STM.
 description:
   A pure simulator monad with support of concurency (base, async), stm,
@@ -17,7 +17,7 @@
 build-type:          Simple
 extra-source-files:  CHANGELOG.md
                      README.md
-tested-with:         GHC == { 8.10, 9.2, 9.4 }
+tested-with:         GHC == { 8.10, 9.2, 9.4, 9.6 }
 
 flag asserts
   description: Enable assertions
@@ -56,7 +56,8 @@
                        Control.Monad.IOSimPOR.Internal,
                        Control.Monad.IOSimPOR.Types,
                        Control.Monad.IOSimPOR.QuickCheckUtils,
-                       Control.Monad.IOSimPOR.Timeout
+                       Control.Monad.IOSimPOR.Timeout,
+                       Data.Deque.Strict
   default-language:    Haskell2010
   other-extensions:    BangPatterns,
                        CPP,
@@ -75,11 +76,10 @@
                        RankNTypes,
                        ScopedTypeVariables,
                        TypeFamilies
-  build-depends:       base              >=4.9 && <4.18,
+  build-depends:       base              >=4.9 && <4.19,
                        io-classes       ^>=1.0,
                        exceptions        >=0.10,
                        containers,
-                       deque,
                        nothunks,
                        parallel,
                        psqueues          >=0.2 && <0.3,
diff --git a/src/Control/Monad/IOSim/Internal.hs b/src/Control/Monad/IOSim/Internal.hs
--- a/src/Control/Monad/IOSim/Internal.hs
+++ b/src/Control/Monad/IOSim/Internal.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE BangPatterns              #-}
-{-# LANGUAGE CPP                       #-}
 {-# LANGUAGE DerivingVia               #-}
 {-# LANGUAGE ExistentialQuantification #-}
 {-# LANGUAGE FlexibleInstances         #-}
@@ -56,10 +55,8 @@
 import           Data.Set (Set)
 import qualified Data.Set as Set
 import           Data.Time (UTCTime (..), fromGregorian)
-import           Deque.Strict (Deque)
-import qualified Deque.Strict as Deque
-
-import           GHC.Exts (fromList)
+import           Data.Deque.Strict (Deque)
+import qualified Data.Deque.Strict as Deque
 
 import           Control.Exception (NonTermination (..), assert, throw)
 import           Control.Monad (join, when)
@@ -829,7 +826,7 @@
     -- To preserve our invariants (that threadBlocked is correct)
     -- we update the runqueue and threads together here
     (unblocked, simstate {
-                  runqueue = runqueue <> fromList unblocked,
+                  runqueue = runqueue <> Deque.fromList unblocked,
                   threads  = threads'
                 })
   where
diff --git a/src/Control/Monad/IOSim/STM.hs b/src/Control/Monad/IOSim/STM.hs
--- a/src/Control/Monad/IOSim/STM.hs
+++ b/src/Control/Monad/IOSim/STM.hs
@@ -21,8 +21,8 @@
 
 import           Numeric.Natural (Natural)
 
-import           Deque.Strict (Deque)
-import qualified Deque.Strict as Deque
+import           Data.Deque.Strict (Deque)
+import qualified Data.Deque.Strict as Deque
 
 --
 -- Default TQueue implementation in terms of a 'TVar' (used by sim)
diff --git a/src/Control/Monad/IOSimPOR/Internal.hs b/src/Control/Monad/IOSimPOR/Internal.hs
--- a/src/Control/Monad/IOSimPOR/Internal.hs
+++ b/src/Control/Monad/IOSimPOR/Internal.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE BangPatterns              #-}
-{-# LANGUAGE CPP                       #-}
 {-# LANGUAGE DerivingVia               #-}
 {-# LANGUAGE ExistentialQuantification #-}
 {-# LANGUAGE FlexibleContexts          #-}
diff --git a/src/Data/Deque/Strict.hs b/src/Data/Deque/Strict.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Deque/Strict.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE LambdaCase #-}
+
+-- | A minimal implementation of a strict deque.
+--
+module Data.Deque.Strict where
+
+import           Prelude hiding (head, init, tail)
+import           Data.Foldable (foldl', foldr')
+import qualified Data.List as List
+
+data Deque a = Deque ![a] ![a]
+
+instance Semigroup (Deque a) where
+    Deque as bs <> Deque as' bs' =
+      Deque as (bs' ++ reverse as' ++ bs)
+
+instance Monoid (Deque a) where
+    mempty = Deque [] []
+
+instance Foldable Deque where
+    foldr step init (Deque head tail) =
+      foldr step (foldl' (flip step) init tail) head
+    foldl' step init (Deque head tail) =
+      foldr' (flip step) (foldl' step init head) tail
+
+fromList :: [a] -> Deque a
+fromList as = Deque as []
+
+snoc :: a -> Deque a -> Deque a
+snoc a (Deque as bs) = Deque as (a : bs)
+
+uncons :: Deque a -> Maybe (a, Deque a)
+uncons = \case
+    Deque (a : head') tail -> Just (a, Deque head' tail)
+    Deque [] tail ->
+      case reverse tail of
+        (a : head') -> Just (a, Deque head' [])
+        []          -> Nothing
+
+filter :: (a -> Bool) -> Deque a -> Deque a
+filter f (Deque head tail) = Deque (List.filter f head) (List.filter f tail)
diff --git a/test/Test/Control/Monad/IOSimPOR.hs b/test/Test/Control/Monad/IOSimPOR.hs
--- a/test/Test/Control/Monad/IOSimPOR.hs
+++ b/test/Test/Control/Monad/IOSimPOR.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP                 #-}
 {-# LANGUAGE DeriveGeneric       #-}
 {-# LANGUAGE FlexibleContexts    #-}
 {-# LANGUAGE LambdaCase          #-}
diff --git a/test/Test/Control/Monad/Utils.hs b/test/Test/Control/Monad/Utils.hs
--- a/test/Test/Control/Monad/Utils.hs
+++ b/test/Test/Control/Monad/Utils.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP                 #-}
 {-# LANGUAGE FlexibleContexts    #-}
 {-# LANGUAGE RankNTypes          #-}
 {-# LANGUAGE ScopedTypeVariables #-}
