diff --git a/bench/Memoize.hs b/bench/Memoize.hs
--- a/bench/Memoize.hs
+++ b/bench/Memoize.hs
@@ -5,6 +5,7 @@
   ( memoizeBenchmark
   ) where
 
+import Prelude hiding (Foldable(..))
 import Data.Bits
 import Data.Chimera
 import Data.Foldable
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+# 0.4.2.0
+
+* Adjust implementation to reflect better implementation of ARM primops in GHC 9.12+.
+
 # 0.4.1.0
 
 * Fix divergence of `fromInfinite` and `fromListWithDef` on infinite inputs.
diff --git a/chimera.cabal b/chimera.cabal
--- a/chimera.cabal
+++ b/chimera.cabal
@@ -1,14 +1,16 @@
 cabal-version:      2.2
 name:               chimera
-version:            0.4.1.0
+version:            0.4.2.0
 license:            BSD-3-Clause
 license-file:       LICENSE
 copyright:          2017-2019 Bodigrim
 maintainer:         andrew.lelechenko@gmail.com
 author:             Bodigrim
 tested-with:
-    ghc ==9.8.1 ghc ==9.6.3 ghc ==9.4.8 ghc ==9.2.8 ghc ==9.0.2
-    ghc ==8.10.7 ghc ==8.8.4 ghc ==8.6.5 ghc ==8.4.4 ghc ==8.2.2
+    ghc ==9.14.1
+    ghc ==9.12.2 ghc ==9.10.3 ghc ==9.8.4 ghc ==9.6.6 ghc ==9.4.8
+    ghc ==9.2.8 ghc ==9.0.2 ghc ==8.10.7 ghc ==8.8.4 ghc ==8.6.5
+    ghc ==8.4.4 ghc ==8.2.2
 
 homepage:           https://github.com/Bodigrim/chimera#readme
 synopsis:
@@ -76,7 +78,7 @@
         transformers <0.7,
         vector <0.14,
 
-    if arch(aarch64)
+    if (arch(aarch64) && impl(ghc <9.12))
         c-sources:    cbits/aarch64.c
         include-dirs: cbits
 
@@ -96,10 +98,10 @@
         base >=4.5 && <5,
         chimera,
         infinite-list,
-        QuickCheck >=2.10 && <2.15,
+        QuickCheck >=2.10 && <2.19,
         tasty <1.6,
         tasty-hunit <0.11,
-        tasty-quickcheck <0.11,
+        tasty-quickcheck <0.12,
         tasty-smallcheck <0.9,
         vector,
 
@@ -117,7 +119,7 @@
         base,
         chimera,
         mtl,
-        random <1.3,
+        random <1.4,
         tasty >=1.4.2,
-        tasty-bench >=0.3.2 && <0.4,
+        tasty-bench >=0.4 && <0.6,
         vector,
diff --git a/src/Data/Chimera/Compat.hs b/src/Data/Chimera/Compat.hs
--- a/src/Data/Chimera/Compat.hs
+++ b/src/Data/Chimera/Compat.hs
@@ -18,9 +18,14 @@
   remWord2#,
 ) where
 
-#ifdef aarch64_HOST_ARCH
-import GHC.Exts (Word(..), Word#, timesWord#)
+#if defined(aarch64_HOST_ARCH) && __GLASGOW_HASKELL__ < 912
 
+import GHC.Exts (Word(..), Word#)
+
+#if __GLASGOW_HASKELL__ < 904
+
+import GHC.Exts (timesWord#)
+
 timesWord2# :: Word# -> Word# -> (# Word#, Word# #)
 timesWord2# x y = (# z, timesWord# x y #)
   where
@@ -28,6 +33,12 @@
 {-# INLINE timesWord2# #-}
 
 foreign import capi unsafe "aarch64.h umulh" c_umulh :: Word -> Word -> Word
+
+#else
+
+import GHC.Exts (timesWord2#)
+
+#endif
 
 remWord2# :: Word# -> Word# -> Word# -> Word#
 remWord2# lo hi m = r
diff --git a/src/Data/Chimera/Internal.hs b/src/Data/Chimera/Internal.hs
--- a/src/Data/Chimera/Internal.hs
+++ b/src/Data/Chimera/Internal.hs
@@ -121,9 +121,9 @@
 -- @since 0.2.0.0
 instance Applicative (Chimera V.Vector) where
   pure a =
-    Chimera $
-      A.arrayFromListN (bits + 1) $
-        G.singleton a : map (\k -> G.replicate (1 `shiftL` k) a) [0 .. bits - 1]
+    Chimera
+      $ A.arrayFromListN (bits + 1)
+      $ G.singleton a : map (\k -> G.replicate (1 `shiftL` k) a) [0 .. bits - 1]
   (<*>) = zipWithSubvectors (<*>)
   liftA2 f = zipWithSubvectors (liftA2 f)
 
@@ -624,10 +624,10 @@
   -> Chimera v a
 prependVector (G.uncons -> Nothing) ch = ch
 prependVector (G.uncons -> Just (pref0, pref)) (Chimera as) =
-  Chimera $
-    fromListN (bits + 1) $
-      fmap sliceAndConcat $
-        [LazySlice 0 1 $ G.singleton pref0] : go 0 1 0 inputs
+  Chimera
+    $ fromListN (bits + 1)
+    $ fmap sliceAndConcat
+    $ [LazySlice 0 1 $ G.singleton pref0] : go 0 1 0 inputs
   where
     inputs :: [(Word, v a)]
     inputs =
