diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 0.4.1 [2024.10.27]
+* Drop support for pre-8.0 versions of GHC.
+
 # 0.4
 * Rename `Nat` constructor to `NT`
 * Rename `run` to `unwrapNT`
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-# natural-transformation [![Hackage version](https://img.shields.io/hackage/v/natural-transformation.svg?style=flat)](http://hackage.haskell.org/package/natural-transformation) [![Build Status](https://img.shields.io/travis/ku-fpg/natural-transformation.svg?style=flat)](https://travis-ci.org/ku-fpg/natural-transformation)
+# natural-transformation [![Hackage version](https://img.shields.io/hackage/v/natural-transformation.svg?style=flat)](http://hackage.haskell.org/package/natural-transformation) [![Build Status](https://github.com/ku-fpg/natural-transformation/workflows/Haskell-CI/badge.svg)](https://github.com/ku-fpg/natural-transformation/actions?query=workflow%3AHaskell-CI)
 
-A natural transformation transforms a container `f a` into another container `g a`. 
-Natural transformations act as functor morphisms in category theory. 
+A natural transformation transforms a container `f a` into another container `g a`.
+Natural transformations act as functor morphisms in category theory.
 Technically, `f` and `g` should be functors, but we allow any correctly-shaped structure.
diff --git a/natural-transformation.cabal b/natural-transformation.cabal
--- a/natural-transformation.cabal
+++ b/natural-transformation.cabal
@@ -1,5 +1,5 @@
 name:                natural-transformation
-version:             0.4
+version:             0.4.1
 synopsis:            A natural transformation package.
 description:         A natural transformation transforms a container @f a@ into another
                      container @g a@. Natural transformations act as functor morphisms
@@ -18,7 +18,18 @@
 category:            Control
 build-type:          Simple
 extra-source-files:  CHANGELOG.md, README.md
-tested-with:         GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1
+tested-with:         GHC == 8.0.2
+                   , GHC == 8.2.2
+                   , GHC == 8.4.4
+                   , GHC == 8.6.5
+                   , GHC == 8.8.4
+                   , GHC == 8.10.7
+                   , GHC == 9.0.2
+                   , GHC == 9.2.8
+                   , GHC == 9.4.8
+                   , GHC == 9.6.6
+                   , GHC == 9.8.2
+                   , GHC == 9.10.1
 cabal-version:       >= 1.10
 
 source-repository head
@@ -30,10 +41,7 @@
                        Control.Natural.RULES
                        Control.Object
 
-  build-depends:       base       >= 4.7  && < 5
-  if !impl(ghc >= 8.0)
-    build-depends:     semigroups >= 0.16 && < 0.19
-
+  build-depends:       base       >= 4.9  && < 5
   hs-source-dirs:      src
   default-language:    Haskell2010
   ghc-options:         -Wall
@@ -41,12 +49,12 @@
 test-suite natural-transformation-properties
   type:                exitcode-stdio-1.0
   main-is:             Properties.hs
-  build-depends:       base                   >= 4.7 && < 5
-                     , containers             >= 0.1 && < 0.6
-                     , natural-transformation == 0.4
+  build-depends:       base                   >= 4.9 && < 5
+                     , containers             >= 0.1 && < 0.8
+                     , natural-transformation
                      , quickcheck-instances   >= 0.1 && < 0.4
-                     , tasty                  >= 0.8 && < 0.12
-                     , tasty-quickcheck       >= 0.8 && < 0.9
+                     , tasty                  >= 0.8 && < 1.6
+                     , tasty-quickcheck       >= 0.8 && < 0.11
   hs-source-dirs:      tests
   default-language:    Haskell2010
   ghc-options:         -Wall
diff --git a/src/Control/Natural.hs b/src/Control/Natural.hs
--- a/src/Control/Natural.hs
+++ b/src/Control/Natural.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE GADTs #-}
@@ -32,11 +31,9 @@
 
 import qualified Control.Category as C (Category(..))
 
-#if !(MIN_VERSION_base(4,8,0))
-import           Data.Monoid (Monoid(..))
-#endif
+#if !(MIN_VERSION_base(4,11,0))
 import           Data.Semigroup (Semigroup(..))
-import           Data.Typeable
+#endif
 
 ---------------------------------------------------------------------------
 -- Naming of ~>, :~> and $$ are taken (with permission) from Edward Kmett's @indexed@ package.
@@ -49,7 +46,6 @@
 infixr 0 :~>, $$
 -- | A natural transformation suitable for storing in a container.
 newtype f :~> g = NT { ($$) :: f ~> g }
-  deriving Typeable
 
 instance C.Category (:~>) where
     id = NT id
diff --git a/src/Control/Natural/RULES.hs b/src/Control/Natural/RULES.hs
--- a/src/Control/Natural/RULES.hs
+++ b/src/Control/Natural/RULES.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE PolyKinds #-}
 {-# LANGUAGE Trustworthy #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
 
 {-|
 Module:      Control.Transformation.RULES
diff --git a/tests/Properties.hs b/tests/Properties.hs
--- a/tests/Properties.hs
+++ b/tests/Properties.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE TypeOperators #-}
 {-|
 Module:      Main
@@ -14,9 +13,6 @@
 import Control.Natural
 
 import Data.Foldable (toList)
-#if !(MIN_VERSION_base(4,8,0))
-import Data.Monoid (Monoid(..))
-#endif
 import Data.Sequence (Seq, fromList)
 
 import Test.QuickCheck.Instances ()
@@ -34,7 +30,7 @@
     ]
 
 -- | Verifies the free theorem for natural transformations, i.e., that
--- 
+--
 -- @
 -- fmap h . r == r . fmap h
 -- @
@@ -43,7 +39,7 @@
 prop_freeTheorem h r t = fmap h (r # t) == (r # fmap h t)
 
 -- | Verifies that natural transformations form a law-abiding 'Monoid', i.e., that
--- 
+--
 --  * @mappend mempty x = x@
 --
 --  * @mappend x mempty = x@
