diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,7 +1,23 @@
+1.0.4
+-----
+
+- Drop support for GHCs prior 8.6.5
+- GHC-9.12 support
+
+1.0.3.1
+-------
+
+- GHC-9.0 support
+
+1.0.3
+-----
+
+- Mark all modules `Trustworthy`. (deprecated modules are `Safe` for GHC-7.4+).
+
 1.0.2.2
 -------
 
-- GHC-8.6.1 compatible relase
+- GHC-8.6.1 compatible release
 - Fix compilation when `+check-bounds`
 
 1.0.2.1
diff --git a/integer-logarithms.cabal b/integer-logarithms.cabal
--- a/integer-logarithms.cabal
+++ b/integer-logarithms.cabal
@@ -1,16 +1,17 @@
 name:               integer-logarithms
-version:            1.0.2.2
-cabal-version:      >= 1.10
+version:            1.0.5
+cabal-version:      >=1.10
 author:             Daniel Fischer
-copyright:          (c) 2011 Daniel Fischer
+copyright:
+  (c) 2011 Daniel Fischer, 2017-2020 Oleg Grenrus, Andrew Lelechenko
+
 license:            MIT
 license-file:       LICENSE
 maintainer:         Oleg Grenrus <oleg.grenrus@iki.fi>
 build-type:         Simple
 stability:          Provisional
-homepage:           https://github.com/Bodigrim/integer-logarithms
-bug-reports:        https://github.com/Bodigrim/integer-logarithms/issues
-
+homepage:           https://github.com/haskellari/integer-logarithms
+bug-reports:        https://github.com/haskellari/integer-logarithms/issues
 synopsis:           Integer logarithms.
 description:
   "Math.NumberTheory.Logarithms" and "Math.NumberTheory.Powers.Integer"
@@ -21,91 +22,100 @@
   additional functions in migrated modules.
 
 category:           Math, Algorithms, Number Theory
-
 tested-with:
-  GHC==7.0.4,
-  GHC==7.2.2,
-  GHC==7.4.2,
-  GHC==7.6.3,
-  GHC==7.8.4,
-  GHC==7.10.3,
-  GHC==8.0.2,
-  GHC==8.2.2,
-  GHC==8.4.3,
-  GHC==8.6.1
+  GHC ==8.6.5
+   || ==8.8.4
+   || ==8.10.4
+   || ==9.0.2
+   || ==9.2.8
+   || ==9.4.8
+   || ==9.6.6
+   || ==9.8.4
+   || ==9.10.2
+   || ==9.12.2
+   || ==9.14.1
 
-extra-source-files  : readme.md changelog.md
+extra-source-files:
+  changelog.md
+  readme.md
 
 flag integer-gmp
-  description:  integer-gmp or integer-simple
-  default:      True
-  manual:       False
+  description: integer-gmp or integer-simple
+  default:     True
+  manual:      False
 
 flag check-bounds
-  description:  Replace unsafe array operations with safe ones
-  default:      False
-  manual:       True
+  description: Replace unsafe array operations with safe ones
+  default:     False
+  manual:      True
 
 library
   default-language: Haskell2010
-  hs-source-dirs: src
+  hs-source-dirs:   src
   build-depends:
-    base >= 4.3 && < 4.13,
-    array >= 0.3 && < 0.6,
-    ghc-prim < 0.6
-  if impl(ghc >= 7.10)
-    cpp-options: -DBase48
-  else
-    build-depends: nats >= 1.1 && <1.2
+      array  >=0.5.3.0  && <0.6
+    , base   >=4.12.0.0 && <4.23
 
-  if flag(integer-gmp)
-    build-depends:
-      integer-gmp < 1.1
+  if !impl(ghc >=7.10)
+    build-depends: nats >=1.1.2 && <1.2
+
+  if impl(ghc >=9.0)
+    build-depends: base >=4.15
+
+    if !flag(integer-gmp)
+      build-depends: invalid-cabal-flag-settings <0
+
   else
-    build-depends:
-      integer-simple
+    build-depends: base <4.15
 
+    if flag(integer-gmp)
+      build-depends: integer-gmp <1.1
+
+    else
+      build-depends: integer-simple
+
   exposed-modules:
     Math.NumberTheory.Logarithms
     Math.NumberTheory.Powers.Integer
     Math.NumberTheory.Powers.Natural
-    GHC.Integer.Logarithms.Compat
+
+  -- compat module
+  exposed-modules:  GHC.Integer.Logarithms.Compat
   other-extensions:
     BangPatterns
     CPP
     MagicHash
 
-  ghc-options: -O2 -Wall
+  ghc-options:      -O2 -Wall
+
   if flag(check-bounds)
     cpp-options: -DCheckBounds
 
 source-repository head
   type:     git
-  location: https://github.com/Bodigrim/integer-logarithms
+  location: https://github.com/haskellari/integer-logarithms
 
 test-suite spec
-  type:                 exitcode-stdio-1.0
-  hs-source-dirs:       test-suite
-  ghc-options:          -Wall
-  main-is:              Test.hs
-  default-language:     Haskell2010
+  type:             exitcode-stdio-1.0
+  hs-source-dirs:   test-suite
+  ghc-options:      -Wall
+  main-is:          Test.hs
+  default-language: Haskell2010
   other-extensions:
-    StandaloneDeriving
     FlexibleContexts
     FlexibleInstances
     GeneralizedNewtypeDeriving
     MultiParamTypeClasses
+    StandaloneDeriving
+
   build-depends:
-    base,
-    integer-logarithms,
-    tasty >= 0.10 && < 1.2,
-    tasty-smallcheck >= 0.8 && < 0.9,
-    tasty-quickcheck >= 0.8 && < 0.11,
-    tasty-hunit >= 0.9 && < 0.11,
-    QuickCheck >= 2.10 && < 2.12,
-    smallcheck >= 1.1.3 && < 1.2
-  if !impl(ghc >= 7.10)
-    build-depends: nats >= 1.1 && <1.2
+      base
+    , integer-logarithms
+    , QuickCheck          >=2.16.0.0 && <2.18
+    , smallcheck          >=1.2      && <1.3
+    , tasty               >=1.4      && <1.6
+    , tasty-quickcheck    >=0.10     && <0.12
+    , tasty-smallcheck    >=0.8      && <0.9
 
   other-modules:
     Math.NumberTheory.LogarithmsTests
diff --git a/src/GHC/Integer/Logarithms/Compat.hs b/src/GHC/Integer/Logarithms/Compat.hs
--- a/src/GHC/Integer/Logarithms/Compat.hs
+++ b/src/GHC/Integer/Logarithms/Compat.hs
@@ -8,6 +8,9 @@
 --
 -- Low level stuff for integer logarithms.
 {-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}
+#if __GLASGOW_HASKELL__ >= 702
+{-# LANGUAGE Trustworthy #-}
+#endif
 module GHC.Integer.Logarithms.Compat
     ( -- * Functions
       integerLogBase#
diff --git a/src/Math/NumberTheory/Logarithms.hs b/src/Math/NumberTheory/Logarithms.hs
--- a/src/Math/NumberTheory/Logarithms.hs
+++ b/src/Math/NumberTheory/Logarithms.hs
@@ -11,6 +11,7 @@
 --
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE MagicHash #-}
+{-# LANGUAGE Trustworthy #-}
 module Math.NumberTheory.Logarithms
     ( -- * Integer logarithms with input checks
       integerLogBase
@@ -41,8 +42,12 @@
 import Data.Array.Unboxed
 import Numeric.Natural
 
+#ifdef MIN_VERSION_ghc_bignum
+import qualified GHC.Num.Natural as BN
+#endif
+
 import GHC.Integer.Logarithms.Compat
-#if Base48 && defined(MIN_VERSION_integer_gmp)
+#if MIN_VERSION_base(4,8,0) && defined(MIN_VERSION_integer_gmp)
 import GHC.Integer.GMP.Internals (Integer (..))
 import GHC.Natural
 #endif
@@ -313,15 +318,13 @@
 fromNatural = fromIntegral
 
 naturalLog2# :: Natural -> Int#
-#if Base48 && defined(MIN_VERSION_integer_gmp)
+#ifdef MIN_VERSION_ghc_bignum
+naturalLog2# n = word2Int# (BN.naturalLog2# n)
+#else
+#if MIN_VERSION_base(4,8,0) && defined(MIN_VERSION_integer_gmp)
 naturalLog2# (NatS# b) = wordLog2# b
 naturalLog2# (NatJ# n) = integerLog2# (Jp# n)
 #else
 naturalLog2# n = integerLog2# (toInteger n)
 #endif
-
-#if __GLASGOW_HASKELL__ < 707
--- The times they are a-changing. The types of primops too :(
-isTrue# :: Bool -> Bool
-isTrue# = id
 #endif
diff --git a/src/Math/NumberTheory/Powers/Integer.hs b/src/Math/NumberTheory/Powers/Integer.hs
--- a/src/Math/NumberTheory/Powers/Integer.hs
+++ b/src/Math/NumberTheory/Powers/Integer.hs
@@ -9,16 +9,12 @@
 -- Potentially faster power function for 'Integer' base and 'Int'
 -- or 'Word' exponent.
 --
-{-# LANGUAGE CPP          #-}
+{-# LANGUAGE Safe #-}
 module Math.NumberTheory.Powers.Integer
     {-# DEPRECATED "It is no faster than (^)" #-}
     ( integerPower
     , integerWordPower
     ) where
-
-#if !MIN_VERSION_base(4,8,0)
-import Data.Word
-#endif
 
 -- | Power of an 'Integer' by the left-to-right repeated squaring algorithm.
 --   This needs two multiplications in each step while the right-to-left
diff --git a/src/Math/NumberTheory/Powers/Natural.hs b/src/Math/NumberTheory/Powers/Natural.hs
--- a/src/Math/NumberTheory/Powers/Natural.hs
+++ b/src/Math/NumberTheory/Powers/Natural.hs
@@ -9,18 +9,14 @@
 -- Potentially faster power function for 'Natural' base and 'Int'
 -- or 'Word' exponent.
 --
-{-# LANGUAGE CPP          #-}
+{-# LANGUAGE Safe #-}
 module Math.NumberTheory.Powers.Natural
     {-# DEPRECATED "It is no faster than (^)" #-}
     ( naturalPower
     , naturalWordPower
     ) where
 
-#if !MIN_VERSION_base(4,8,0)
-import Data.Word
-#endif
-
-import Numeric.Natural
+import Numeric.Natural (Natural)
 
 -- | Power of an 'Natural' by the left-to-right repeated squaring algorithm.
 --   This needs two multiplications in each step while the right-to-left
diff --git a/test-suite/Math/NumberTheory/LogarithmsTests.hs b/test-suite/Math/NumberTheory/LogarithmsTests.hs
--- a/test-suite/Math/NumberTheory/LogarithmsTests.hs
+++ b/test-suite/Math/NumberTheory/LogarithmsTests.hs
@@ -8,8 +8,6 @@
 -- Tests for Math.NumberTheory.Logarithms
 --
 
-{-# LANGUAGE CPP       #-}
-
 {-# OPTIONS_GHC -fno-warn-type-defaults #-}
 
 module Math.NumberTheory.LogarithmsTests
@@ -17,11 +15,6 @@
   ) where
 
 import Test.Tasty
-
-#if MIN_VERSION_base(4,8,0)
-#else
-import Data.Word
-#endif
 import Numeric.Natural
 
 import Math.NumberTheory.Logarithms
@@ -68,7 +61,7 @@
 naturalLog2HugeProperty :: Huge (Positive Natural) -> Bool
 naturalLog2HugeProperty (Huge (Positive n)) = 2 ^ l <= n && 2 ^ (l + 1) > n
   where
-    l = fromIntegral $ naturalLog2 n
+    l = naturalLog2 n
 
 -- | Check that 'naturalLog10' returns the largest natural @l@ such that 10 ^ @l@ <= @n@ and 10 ^ (@l@+1) > @n@.
 naturalLog10Property :: Positive Natural -> Bool
diff --git a/test-suite/Orphans.hs b/test-suite/Orphans.hs
--- a/test-suite/Orphans.hs
+++ b/test-suite/Orphans.hs
@@ -1,12 +1,15 @@
+{-# LANGUAGE CPP #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 module Orphans () where
 
 import Numeric.Natural (Natural)
 import Test.QuickCheck (Arbitrary (..))
 
+#if !MIN_VERSION_QuickCheck(2,17,0)
 -- | The QuickCheck-2.10 doesn't define the Arbitrary Natural instance
 -- We define own instance (and not use quickcheck-instance) to break
 -- the cycle in tests.
 instance Arbitrary Natural where
     arbitrary = fmap (fromInteger . abs) arbitrary
     shrink = map (fromInteger . abs) . shrink . fromIntegral
+#endif
