diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,17 @@
+## 0.2.4
+* Allow building with GHC 9.4.
+
+## 0.2.3
+* bump for upstream change
+
+## 0.2.0.2
+* minor: fix for upstream change
+
+## 0.2.0.1
+* use ticketed CAS internally; add support for -prof mode
+
+## 0.2
+* switched to MutVar
+
+## 0.1
+* initial version
diff --git a/Data/Concurrent/Queue/MichaelScott.hs b/Data/Concurrent/Queue/MichaelScott.hs
--- a/Data/Concurrent/Queue/MichaelScott.hs
+++ b/Data/Concurrent/Queue/MichaelScott.hs
@@ -21,7 +21,10 @@
 
 import Data.IORef (readIORef, newIORef)
 import System.IO (stderr)
+
+#ifdef DEBUG
 import Data.ByteString.Char8 (hPutStrLn, pack)
+#endif
 
 -- import GHC.Types (Word(W#))
 import GHC.IORef(IORef(IORef))
@@ -31,19 +34,14 @@
 import Data.Atomics (readForCAS, casIORef, Ticket, peekTicket)
 
 -- GHC 7.8 changed some primops
-#if MIN_VERSION_base(4,7,0)
 import GHC.Base  hiding ((==#), sameMutVar#)
-import GHC.Prim hiding ((==#), sameMutVar#)
-import qualified GHC.PrimopWrappers as GPW
+import GHC.Exts hiding ((==#), sameMutVar#)
+import qualified GHC.Exts as Exts
 (==#) :: Int# -> Int# -> Bool
-(==#) x y = case x GPW.==# y of { 0# -> False; _ -> True }
+(==#) x y = case x Exts.==# y of { 0# -> False; _ -> True }
 
 sameMutVar# :: MutVar# s a -> MutVar# s a -> Bool
-sameMutVar# x y = case GPW.sameMutVar# x y of { 0# -> False; _ -> True }
-#else
-import GHC.Base
-import GHC.Prim
-#endif
+sameMutVar# x y = case Exts.sameMutVar# x y of { 0# -> False; _ -> True }
 
 
 -- Considering using the Queue class definition:
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1 @@
+See haddock in Data.Concurrent.LinkedQueue
diff --git a/lockfree-queue.cabal b/lockfree-queue.cabal
--- a/lockfree-queue.cabal
+++ b/lockfree-queue.cabal
@@ -1,23 +1,16 @@
 Name:                lockfree-queue
-Version:             0.2.3.1
+Version:             0.2.4
 License:             BSD3
 License-file:        LICENSE
 Author:              Ryan R. Newton
 Maintainer:          rrnewton@gmail.com
 Category:            Data, Concurrent
 Build-type:          Simple
-Cabal-version:       >=1.8
-
+Cabal-version:       1.18
+tested-with:         GHC == 8.4.3, GHC == 8.2.2, GHC == 8.0.2, GHC == 7.10.3
 Homepage: https://github.com/rrnewton/haskell-lockfree/wiki
 Bug-Reports: https://github.com/rrnewton/haskell-lockfree/issues
 
--- Version History:
--- 0.1 -- initial version
--- 0.2 -- switched to MutVar 
--- 0.2.0.1 -- use ticketed CAS internally; add support for -prof mode
--- 0.2.0.2 -- minor: fix for upstream change
--- 0.2.3   -- bump for upstream change
-
 Synopsis: Michael and Scott lock-free queues.
 
 Description:
@@ -32,17 +25,21 @@
   @ConcurrentLinkedQueue@.
 
 extra-source-files:
+     CHANGELOG.md
+     README.md
      stress_test.sh
 
 Library
   exposed-modules:   Data.Concurrent.Queue.MichaelScott,
                      Data.Concurrent.Queue.MichaelScott.DequeInstance
-  build-depends:     base >= 4.4.0.0 && < 5,
-                     ghc-prim, abstract-deque >= 0.3, bytestring,
-                     atomic-primops >= 0.6
+  build-depends:     base >= 4.8 && < 5
+                   , ghc-prim
+                   , abstract-deque >= 0.3
+                   , atomic-primops >= 0.6
   -- Build failure on GHC 7.2:
   --                     queuelike
   ghc-options: -O2
+  default-language: Haskell2010
 
 Source-Repository head
     Type:         git
@@ -51,16 +48,21 @@
 
 Test-Suite test-lockfree-queue
     type:       exitcode-stdio-1.0
-    hs-source-dirs: ./tests/
+    hs-source-dirs: tests
     main-is:    Test.hs
     build-depends: lockfree-queue
-    build-depends: base >= 4.4.0.0 && < 5, 
-                   bytestring, 
-                   abstract-deque >= 0.3, abstract-deque-tests >= 0.3, 
-                   HUnit, test-framework, test-framework-hunit,
-                   ghc-prim, atomic-primops >= 0.6
+    build-depends: base >= 4.8 && < 5
+                 , bytestring
+                 , abstract-deque >= 0.3
+                 , abstract-deque-tests >= 0.3
+                 , HUnit
+                 , test-framework
+                 , test-framework-hunit
+                 , ghc-prim
+                 , atomic-primops >= 0.6
 
-    ghc-options: -O2 -threaded -rtsopts 
+    ghc-options: -O2 -threaded -rtsopts
+    default-language: Haskell2010
     -- Debugging generated code:
     -- ghc-options: -keep-tmp-files -dsuppress-module-prefixes -ddump-to-file -ddump-core-stats -ddump-simpl-stats -dcore-lint -dcmm-lint
     -- ghc-options: -ddump-ds -ddump-simpl -ddump-stg -ddump-asm -ddump-bcos -ddump-cmm -ddump-opt-cmm -ddump-inlinings
@@ -71,7 +73,7 @@
 --     build-depends: base >= 4.4.0.0 && < 5, IORefCAS >= 0.2, abstract-deque, bytestring,
 --                    HUnit, test-framework, test-framework-hunit,
 --                    ghc-prim, atomic-primops
---     ghc-options: -O2 -threaded -rtsopts 
+--     ghc-options: -O2 -threaded -rtsopts
 --     -- Debugging generated code:
 --     ghc-options: -keep-tmp-files -dsuppress-module-prefixes -ddump-to-file -ddump-core-stats -ddump-simpl-stats -dcore-lint -dcmm-lint
 --     ghc-options: -ddump-ds -ddump-simpl -ddump-stg -ddump-asm -ddump-bcos -ddump-cmm -ddump-opt-cmm -ddump-inlinings
