diff --git a/Basement/BoxedArray.hs b/Basement/BoxedArray.hs
--- a/Basement/BoxedArray.hs
+++ b/Basement/BoxedArray.hs
@@ -86,6 +86,7 @@
 import qualified Basement.Alg.Mutable as Alg
 import           Basement.Compat.MonadTrans
 import           Basement.Compat.Semigroup
+import           Basement.Compat.Primitive
 import           Basement.Types.OffsetSize
 import           Basement.PrimType
 import           Basement.NormalForm
diff --git a/Basement/Compat/Primitive.hs b/Basement/Compat/Primitive.hs
--- a/Basement/Compat/Primitive.hs
+++ b/Basement/Compat/Primitive.hs
@@ -15,6 +15,7 @@
     , compatMkWeak#
     , compatIsByteArrayPinned#
     , compatIsMutableByteArrayPinned#
+    , unsafeCoerce#
     , Word(..)
     ) where
 
@@ -26,7 +27,8 @@
 
 import           Basement.Compat.PrimTypes
 
---  GHC 8.8  | Base 4.13
+--  GHC 9.0  | Base 4.15
+--  GHC 8.8  | Base 4.13 4.14
 --  GHC 8.6  | Base 4.12
 --  GHC 8.4  | Base 4.11
 --  GHC 8.2  | Base 4.10
diff --git a/Basement/FinalPtr.hs b/Basement/FinalPtr.hs
--- a/Basement/FinalPtr.hs
+++ b/Basement/FinalPtr.hs
@@ -25,7 +25,7 @@
     ) where
 
 import GHC.Ptr
-import GHC.ForeignPtr
+import qualified GHC.ForeignPtr as GHCF
 import GHC.IO
 import Basement.Monad
 import Basement.Compat.Primitive
@@ -35,7 +35,7 @@
 
 -- | Create a pointer with an associated finalizer
 data FinalPtr a = FinalPtr (Ptr a)
-                | FinalForeign (ForeignPtr a)
+                | FinalForeign (GHCF.ForeignPtr a)
 instance Show (FinalPtr a) where
     show f = runST $ withFinalPtr f (pure . show)
 instance Eq (FinalPtr a) where
@@ -50,7 +50,7 @@
 -- same address, they should be the same final ptr
 finalPtrSameMemory :: FinalPtr a -> FinalPtr b -> Bool
 finalPtrSameMemory (FinalPtr p1)     (FinalPtr p2)     = p1 == castPtr p2
-finalPtrSameMemory (FinalForeign p1) (FinalForeign p2) = p1 == castForeignPtr p2
+finalPtrSameMemory (FinalForeign p1) (FinalForeign p2) = p1 == GHCF.castForeignPtr p2
 finalPtrSameMemory (FinalForeign _)  (FinalPtr _)      = False
 finalPtrSameMemory (FinalPtr _)      (FinalForeign _)  = False
 
@@ -62,17 +62,17 @@
         case compatMkWeak# ptr () (finalizer ptr) s of { (# s2, _ #) -> (# s2, FinalPtr ptr #) }
 
 -- | Create a new FinalPtr from a ForeignPtr
-toFinalPtrForeign :: ForeignPtr a -> FinalPtr a
+toFinalPtrForeign :: GHCF.ForeignPtr a -> FinalPtr a
 toFinalPtrForeign fptr = FinalForeign fptr
 
 -- | Cast a finalized pointer from type a to type b
 castFinalPtr :: FinalPtr a -> FinalPtr b
 castFinalPtr (FinalPtr a)     = FinalPtr (castPtr a)
-castFinalPtr (FinalForeign a) = FinalForeign (castForeignPtr a)
+castFinalPtr (FinalForeign a) = FinalForeign (GHCF.castForeignPtr a)
 
 withFinalPtrNoTouch :: FinalPtr p -> (Ptr p -> a) -> a
 withFinalPtrNoTouch (FinalPtr ptr) f = f ptr
-withFinalPtrNoTouch (FinalForeign fptr) f = f (unsafeForeignPtrToPtr fptr)
+withFinalPtrNoTouch (FinalForeign fptr) f = f (GHCF.unsafeForeignPtrToPtr fptr)
 {-# INLINE withFinalPtrNoTouch #-}
 
 -- | Looks at the raw pointer inside a FinalPtr, making sure the
@@ -83,14 +83,14 @@
     primTouch ptr
     pure r
 withFinalPtr (FinalForeign fptr) f = do
-    r <- f (unsafeForeignPtrToPtr fptr)
-    unsafePrimFromIO (touchForeignPtr fptr)
+    r <- f (GHCF.unsafeForeignPtrToPtr fptr)
+    unsafePrimFromIO (GHCF.touchForeignPtr fptr)
     pure r
 {-# INLINE withFinalPtr #-}
 
 touchFinalPtr :: PrimMonad prim => FinalPtr p -> prim ()
 touchFinalPtr (FinalPtr ptr) = primTouch ptr
-touchFinalPtr (FinalForeign fptr) = unsafePrimFromIO (touchForeignPtr fptr)
+touchFinalPtr (FinalForeign fptr) = unsafePrimFromIO (GHCF.touchForeignPtr fptr)
 
 -- | Unsafe version of 'withFinalPtr'
 withUnsafeFinalPtr :: PrimMonad prim => FinalPtr p -> (Ptr p -> prim a) -> a
diff --git a/Basement/Monad.hs b/Basement/Monad.hs
--- a/Basement/Monad.hs
+++ b/Basement/Monad.hs
@@ -35,6 +35,7 @@
 import           GHC.IO
 import           GHC.Prim
 import           Basement.Compat.Base (Exception, (.), ($), Applicative, Monad)
+import           Basement.Compat.Primitive
 
 -- | Primitive monad that can handle mutation.
 --
diff --git a/Basement/Numerical/Additive.hs b/Basement/Numerical/Additive.hs
--- a/Basement/Numerical/Additive.hs
+++ b/Basement/Numerical/Additive.hs
@@ -1,5 +1,7 @@
 {-# LANGUAGE CPP               #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MagicHash         #-}
+{-# LANGUAGE TypeSynonymInstances #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DefaultSignatures #-}
 {-# OPTIONS_GHC -fno-prof-auto #-}
@@ -117,6 +119,7 @@
     azero = 0
     (+) = (Word256.+)
     scale = scaleNum
+
 instance Additive Prelude.Float where
     azero = 0.0
     (F# a) + (F# b) = F# (a `plusFloat#` b)
@@ -124,6 +127,10 @@
 instance Additive Prelude.Double where
     azero = 0.0
     (D# a) + (D# b) = D# (a +## b)
+    scale = scaleNum
+instance Additive Prelude.Rational where
+    azero = 0.0
+    (+) = (Prelude.+)
     scale = scaleNum
 
 instance (KnownNat n, NatWithinBound Word64 n) => Additive (Zn64 n) where
diff --git a/Basement/String.hs b/Basement/String.hs
--- a/Basement/String.hs
+++ b/Basement/String.hs
@@ -813,7 +813,7 @@
   where
     !(C.ValidRange start end) = C.offsetsValidRange arr
 
--- Finds where are the insertion points when we search for a `needle`
+-- | Finds where are the insertion points when we search for a `needle`
 -- within an `haystack`.
 indices :: String -> String -> [Offset8]
 indices (String ned) (String hy) = Vec.indices ned hy
diff --git a/basement.cabal b/basement.cabal
--- a/basement.cabal
+++ b/basement.cabal
@@ -1,5 +1,5 @@
 name:                basement
-version:             0.0.11
+version:             0.0.12
 synopsis:            Foundation scrap box of array & string
 description:         Foundation most basic primitives without any dependencies
 license:             BSD3
