diff --git a/doctest/DoctestDriver.hs b/doctest/DoctestDriver.hs
new file mode 100644
--- /dev/null
+++ b/doctest/DoctestDriver.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE CPP #-}
+
+#if MIN_VERSION_GLASGOW_HASKELL(8,4,4,0)
+{-# OPTIONS_GHC -F -pgmF doctest-discover #-}
+#else
+module Main where
+
+import qualified System.IO as IO
+
+main :: IO ()
+main = IO.putStrLn "WARNING: doctest will not run on GHC versions earlier than 8.4.4"
+#endif
diff --git a/hw-fingertree-strict.cabal b/hw-fingertree-strict.cabal
--- a/hw-fingertree-strict.cabal
+++ b/hw-fingertree-strict.cabal
@@ -1,46 +1,48 @@
-cabal-version:  2.2
+cabal-version: 2.2
 
-name:               hw-fingertree-strict
-version:            0.1.1.3
-synopsis:           Generic strict finger-tree structure
-description:        A general sequence representation with arbitrary
-                    annotations, for use as a base for implementations of
-                    various collection types, with examples, as described
-                    in section 4 of
-                    .
-                    * Ralf Hinze and Ross Paterson,
-                    \"Finger trees: a simple general-purpose data structure\",
-                    /Journal of Functional Programming/ 16:2 (2006) pp 197-217.
-                    <http://staff.city.ac.uk/~ross/papers/FingerTree.html>
-                    .
-                    For a tuned sequence type, see @Data.Sequence@ in the
-                    @containers@ package, which is a specialization of
-                    this structure.
-category:           Data Structures
-homepage:           https://github.com/haskell-works/hw-fingertree-strict#readme
-bug-reports:        https://github.com/haskell-works/hw-fingertree-strict/issues
-author:             John Ky
-maintainer:         newhoggy@gmail.com
-copyright:          2017-2019 John Ky;
-                    2006 Ross Paterson, Ralf Hinze
-license:            BSD-3-Clause
-license-file:       LICENSE
-tested-with:        GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2
-build-type:         Simple
-extra-source-files: README.md
+name:                   hw-fingertree-strict
+version:                0.1.2.0
+synopsis:               Generic strict finger-tree structure
+description:            A general sequence representation with arbitrary
+                        annotations, for use as a base for implementations of
+                        various collection types, with examples, as described
+                        in section 4 of
+                        .
+                        * Ralf Hinze and Ross Paterson,
+                        \"Finger trees: a simple general-purpose data structure\",
+                        /Journal of Functional Programming/ 16:2 (2006) pp 197-217.
+                        <http://staff.city.ac.uk/~ross/papers/FingerTree.html>
+                        .
+                        For a tuned sequence type, see @Data.Sequence@ in the
+                        @containers@ package, which is a specialization of
+                        this structure.
+category:               Data Structures
+homepage:               https://github.com/haskell-works/hw-fingertree-strict#readme
+bug-reports:            https://github.com/haskell-works/hw-fingertree-strict/issues
+author:                 John Ky
+maintainer:             newhoggy@gmail.com
+copyright:              2017-2020 John Ky;
+                        2006 Ross Paterson, Ralf Hinze
+license:                BSD-3-Clause
+license-file:           LICENSE
+tested-with:            GHC == 8.10.1, GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4
+build-type:             Simple
+extra-source-files:     README.md
 
 source-repository head
   type: git
   location: https://github.com/haskell-works/hw-fingertree-strict
 
-common base                       { build-depends: base                       >= 4.7        && < 5      }
+common base                       { build-depends: base                       >= 4.11       && < 5      }
 
 common deepseq                    { build-depends: deepseq                    >= 1.4        && < 1.5    }
+common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.17   }
+common doctest-discover           { build-depends: doctest-discover           >= 0.2        && < 0.3    }
 common hedgehog                   { build-depends: hedgehog                   >= 0.6        && < 1.1    }
 common hspec                      { build-depends: hspec                      >= 2.4        && < 2.8    }
 common HUnit                      { build-depends: HUnit                      >= 1.5        && < 1.7    }
 common hw-hspec-hedgehog          { build-depends: hw-hspec-hedgehog          >= 0.1        && < 0.2    }
-common QuickCheck                 { build-depends: QuickCheck                 >= 2.10       && < 2.14   }
+common QuickCheck                 { build-depends: QuickCheck                 >= 2.10       && < 2.15   }
 common test-framework             { build-depends: test-framework                                       }
 common test-framework-hunit       { build-depends: test-framework-hunit                                 }
 common test-framework-quickcheck2 { build-depends: test-framework-quickcheck2                           }
@@ -50,9 +52,6 @@
 
 common config
   default-language:     Haskell2010
-  if !(impl(ghc >= 8.0))
-    build-depends:
-      semigroups == 0.18.*
 
 library
     import:             base, config
@@ -86,7 +85,6 @@
   ghc-options:          -threaded -rtsopts -with-rtsopts=-N
   cpp-options:          -DTESTING
   build-tool-depends:   hspec-discover:hspec-discover
-  autogen-modules:      Paths_hw_fingertree_strict
   other-modules:        HaskellWorks.Data.FingerTree.Gen
                         HaskellWorks.Data.FingerTree.Strict.Gen
                         HaskellWorks.Data.FingerTree.StrictSpec
@@ -96,4 +94,15 @@
                         HaskellWorks.Data.SegmentSet.Naive
                         HaskellWorks.Data.SegmentSet.NaiveSpec
                         HaskellWorks.Data.SegmentSet.StrictSpec
-                        Paths_hw_fingertree_strict
+
+test-suite doctest
+  import:               base, config
+                      , doctest
+                      , doctest-discover
+                      , hw-fingertree-strict
+  default-language:     Haskell2010
+  type:                 exitcode-stdio-1.0
+  ghc-options:          -threaded
+  main-is:              DoctestDriver.hs
+  HS-Source-Dirs:       doctest
+  build-tool-depends:   doctest-discover:doctest-discover
diff --git a/src/HaskellWorks/Data/FingerTree/Strict.hs b/src/HaskellWorks/Data/FingerTree/Strict.hs
--- a/src/HaskellWorks/Data/FingerTree/Strict.hs
+++ b/src/HaskellWorks/Data/FingerTree/Strict.hs
@@ -67,7 +67,6 @@
 import Control.Applicative (Applicative (pure, (<*>)), (<$>))
 import Control.DeepSeq     (NFData)
 import Data.Foldable       (Foldable (foldMap), foldr', toList)
-import Data.Monoid
 import GHC.Generics        (Generic)
 
 import qualified Data.Semigroup as S
diff --git a/src/HaskellWorks/Data/IntervalMap/Strict.hs b/src/HaskellWorks/Data/IntervalMap/Strict.hs
--- a/src/HaskellWorks/Data/IntervalMap/Strict.hs
+++ b/src/HaskellWorks/Data/IntervalMap/Strict.hs
@@ -47,7 +47,6 @@
 import Control.Applicative                 ((<$>))
 import Control.DeepSeq                     (NFData)
 import Data.Foldable                       (Foldable (foldMap))
-import Data.Monoid
 import Data.Traversable                    (Traversable (traverse))
 import GHC.Generics                        (Generic)
 import HaskellWorks.Data.FingerTree.Strict (FingerTree, Measured (..), ViewL (..), (<|), (><))
diff --git a/src/HaskellWorks/Data/PriorityQueue/Strict.hs b/src/HaskellWorks/Data/PriorityQueue/Strict.hs
--- a/src/HaskellWorks/Data/PriorityQueue/Strict.hs
+++ b/src/HaskellWorks/Data/PriorityQueue/Strict.hs
@@ -59,7 +59,6 @@
 import Control.Arrow                       ((***))
 import Control.DeepSeq                     (NFData)
 import Data.Foldable                       (Foldable (foldMap))
-import Data.Monoid
 import GHC.Generics                        (Generic)
 import HaskellWorks.Data.FingerTree.Strict (FingerTree, Measured (..), ViewL (..), (<|), (><), (|>))
 import Prelude                             hiding (null, take)
diff --git a/test/HaskellWorks/Data/FingerTree/StrictSpec.hs b/test/HaskellWorks/Data/FingerTree/StrictSpec.hs
--- a/test/HaskellWorks/Data/FingerTree/StrictSpec.hs
+++ b/test/HaskellWorks/Data/FingerTree/StrictSpec.hs
@@ -9,7 +9,6 @@
 import Data.Foldable                       (Foldable (foldMap, foldl, foldr), all, toList)
 import Data.Functor                        ((<$>))
 import Data.List                           (inits)
-import Data.Monoid                         (Monoid (..))
 import Data.Traversable                    (traverse)
 import HaskellWorks.Data.FingerTree.Strict
 import HaskellWorks.Hspec.Hedgehog
diff --git a/test/HaskellWorks/Data/FingerTreeSpec.hs b/test/HaskellWorks/Data/FingerTreeSpec.hs
--- a/test/HaskellWorks/Data/FingerTreeSpec.hs
+++ b/test/HaskellWorks/Data/FingerTreeSpec.hs
@@ -9,7 +9,6 @@
 import Data.Foldable                       (Foldable (foldMap, foldl, foldr), all, toList)
 import Data.Functor                        ((<$>))
 import Data.List                           (inits)
-import Data.Monoid                         (Monoid (..))
 import Data.Traversable                    (traverse)
 import HaskellWorks.Data.FingerTree.Strict
 import HaskellWorks.Hspec.Hedgehog
