diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+1.4.4
+  - Support GHC 9.10
+
 1.4.3
   - Support GHC 9.8
   - Support GHC 9.6
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -28,6 +28,10 @@
 
 ### GHC Versions
 
+#### GHC 9.10
+
+Supported on Linux and Darwin.
+
 #### GHC 9.8
 
 Supported on Linux and Darwin.
diff --git a/proto3-wire.cabal b/proto3-wire.cabal
--- a/proto3-wire.cabal
+++ b/proto3-wire.cabal
@@ -1,7 +1,7 @@
 cabal-version: >=1.10
 
 name:         proto3-wire
-version:      1.4.3
+version:      1.4.4
 synopsis:     A low-level implementation of the Protocol Buffers (version 3) wire format
 license:      Apache-2.0
 license-file: LICENSE
@@ -39,7 +39,7 @@
     , cereal >= 0.5.1 && <0.6
     , containers >=0.5 && < 0.8
     , deepseq >=1.4 && <1.6
-    , hashable <1.5
+    , hashable <1.6
     , parameterized >=0.5.0.0 && <1
     , primitive >=0.6.4 && <0.10
     , safe ==0.3.*
@@ -77,12 +77,12 @@
       base >=4.9 && <=5.0
     , bytestring >=0.10.6.0 && <0.13.0
     , cereal >= 0.5.1 && <0.6
-    , doctest >= 0.7.0 && <0.23.0
+    , doctest >= 0.7.0 && <0.24.0
     , proto3-wire
     , QuickCheck >=2.8 && <3.0
     , tasty >= 0.11 && <1.6
     , tasty-hunit >= 0.9 && <0.11
-    , tasty-quickcheck >= 0.8.4 && <0.11
+    , tasty-quickcheck >= 0.8.4 && <0.12
     , text >= 0.2 && <2.2
     , text-short ==0.1.*
     , transformers >=0.5.6.2 && <0.7
diff --git a/src/Proto3/Wire/Decode.hs b/src/Proto3/Wire/Decode.hs
--- a/src/Proto3/Wire/Decode.hs
+++ b/src/Proto3/Wire/Decode.hs
@@ -23,6 +23,7 @@
 -- from the untyped 'Map' representation obtained from 'decodeWire'.
 
 {-# LANGUAGE BangPatterns               #-}
+{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE DeriveFunctor              #-}
 {-# LANGUAGE LambdaCase                 #-}
 {-# LANGUAGE OverloadedStrings          #-}
@@ -86,7 +87,9 @@
 import qualified Data.ByteString         as B
 import qualified Data.ByteString.Lazy    as BL
 import qualified Data.ByteString.Short   as BS
+#if !MIN_VERSION_base(4,20,0)
 import           Data.Foldable           ( foldl' )
+#endif
 import qualified Data.IntMap.Strict      as M -- TODO intmap
 import           Data.Maybe              ( fromMaybe )
 import           Data.Serialize.Get      ( Get, getWord8, getInt32le
diff --git a/src/Proto3/Wire/Reverse/Internal.hs b/src/Proto3/Wire/Reverse/Internal.hs
--- a/src/Proto3/Wire/Reverse/Internal.hs
+++ b/src/Proto3/Wire/Reverse/Internal.hs
@@ -462,7 +462,7 @@
       -- until a state action frees the stable pointer or modifies the state
       -- variable, the stable pointer will reference the state variable,
       -- which in turn will reference the current buffer.
-      let allocation = P.sizeofMutableByteArray buffer - metaDataSize
+      allocation <- subtract metaDataSize <$> P.getSizeofMutableByteArray buffer
       if allocation <= I# unused
         then
           pure (oldSealed, total, stateVar, statePtr, Just buffer)
@@ -573,8 +573,8 @@
       Just buf -> do
         -- Recycle the old current buffer, from which
         -- we already copied what we wished to keep.
-        let u1 = P.sizeofMutableByteArray buf - metaDataSize
-            !(PTR base) = P.mutableByteArrayContents buf
+        u1 <- subtract metaDataSize <$> P.getSizeofMutableByteArray buf
+        let !(PTR base) = P.mutableByteArrayContents buf
             !v1 = plusPtr (Ptr base) (metaDataSize + u1)
             !m = plusPtr (Ptr base) metaDataSize
         writeSpace m (u1 + total)
