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.cabal b/hw-fingertree.cabal
--- a/hw-fingertree.cabal
+++ b/hw-fingertree.cabal
@@ -1,7 +1,7 @@
-cabal-version:  2.2
+cabal-version: 2.2
 
 name:                   hw-fingertree
-version:                0.1.1.1
+version:                0.1.2.0
 synopsis:               Generic finger-tree structure, with example instances
 description:            A general sequence representation with arbitrary
                         annotations, for use as a base for implementations of
@@ -20,30 +20,33 @@
 homepage:               https://github.com/haskell-works/hw-fingertree#readme
 bug-reports:            https://github.com/haskell-works/hw-fingertree/issues
 maintainer:             John Ky <newhoggy@gmail.com>
-copyright:              (c) 2017-2019 John Ky
+copyright:              (c) 2017-2020 John Ky
                         (c) 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
+tested-with:            GHC == 8.10.1, GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4
 build-type:             Simple
 
 source-repository head
   type: git
   location: https://github.com/haskell-works/hw-fingertree
 
-common base                       { build-depends: base                       >= 4          && < 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        && < 3.0    }
 common hw-hspec-hedgehog          { build-depends: hw-hspec-hedgehog          >= 0.1        && < 0.2    }
 common hw-prim                    { build-depends: hw-prim                    >= 0.6.2.25   && < 0.7    }
 
 common config
-  default-language: Haskell2010
+  default-language:     Haskell2010
+  ghc-options:          -Wall
 
 common hw-fingertree
-  build-depends: hw-fingertree
+  build-depends:        hw-fingertree
 
 library
   import:               base, config
@@ -61,13 +64,23 @@
                       , deepseq
                       , hedgehog
                       , hspec
+                      , hw-fingertree
                       , hw-hspec-hedgehog
-  build-depends:        hw-fingertree
   type:                 exitcode-stdio-1.0
   main-is:              Spec.hs
   hs-source-dirs:       tests
   build-tool-depends:   hspec-discover:hspec-discover
-  autogen-modules:      Paths_hw_fingertree
   other-modules:        HaskellWorks.Data.FingerTree.Gen
                         HaskellWorks.Data.FingerTreeSpec
-                        Paths_hw_fingertree
+
+test-suite doctest
+  import:               base, config
+                      , doctest
+                      , doctest-discover
+                      , hw-fingertree
+  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.hs b/src/HaskellWorks/Data/FingerTree.hs
--- a/src/HaskellWorks/Data/FingerTree.hs
+++ b/src/HaskellWorks/Data/FingerTree.hs
@@ -80,7 +80,6 @@
 import Control.Applicative          (Applicative (pure, (<*>)), (<$>))
 import Control.DeepSeq
 import Data.Foldable                (Foldable (foldMap), toList)
-import Data.Monoid
 import GHC.Generics                 (Generic)
 import HaskellWorks.Data.Container
 import HaskellWorks.Data.Cons
diff --git a/src/HaskellWorks/Data/IntervalMap/FingerTree.hs b/src/HaskellWorks/Data/IntervalMap/FingerTree.hs
--- a/src/HaskellWorks/Data/IntervalMap/FingerTree.hs
+++ b/src/HaskellWorks/Data/IntervalMap/FingerTree.hs
@@ -51,10 +51,9 @@
 import Control.Applicative          ((<$>))
 import Control.DeepSeq
 import Data.Foldable                (Foldable (foldMap))
-import Data.Monoid
 import Data.Traversable             (Traversable (traverse))
 import GHC.Generics
-import HaskellWorks.Data.FingerTree (FingerTree, Measured (..), ViewL (..), (<|), (><), (|>))
+import HaskellWorks.Data.FingerTree (FingerTree, Measured (..), ViewL (..), (<|), (><))
 
 import qualified Data.Semigroup               as S
 import qualified HaskellWorks.Data.FingerTree as FT
diff --git a/src/HaskellWorks/Data/PriorityQueue/FingerTree.hs b/src/HaskellWorks/Data/PriorityQueue/FingerTree.hs
--- a/src/HaskellWorks/Data/PriorityQueue/FingerTree.hs
+++ b/src/HaskellWorks/Data/PriorityQueue/FingerTree.hs
@@ -53,7 +53,6 @@
 
 import Control.Arrow                ((***))
 import Data.Foldable                (Foldable (foldMap))
-import Data.Monoid
 import HaskellWorks.Data.FingerTree (FingerTree, Measured (..), ViewL (..), (<|), (><), (|>))
 import Prelude                      hiding (null)
 
diff --git a/tests/HaskellWorks/Data/FingerTree/Gen.hs b/tests/HaskellWorks/Data/FingerTree/Gen.hs
--- a/tests/HaskellWorks/Data/FingerTree/Gen.hs
+++ b/tests/HaskellWorks/Data/FingerTree/Gen.hs
@@ -26,8 +26,8 @@
     [deep pr' m  sf  | pr' <- shrinkDigit      pr] ++
     [deep pr  m' sf  | m'  <- shrinkFingerTree m ] ++
     [deep pr  m  sf' | sf' <- shrinkDigit      sf]
-shrinkFingerTree (Single x) = []
-shrinkFingerTree Empty = []
+shrinkFingerTree (Single _) = []
+shrinkFingerTree Empty      = []
 
 fingerTree :: (MonadGen m, Measured v a) => m a -> m (FingerTree v a)
 fingerTree gen = G.sized $ \size -> genSizedFingerTree size gen
@@ -36,10 +36,10 @@
 genSizedFingerTree n gen = G.shrink shrinkFingerTree $ case n of
     0 -> return Empty
     1 -> Single <$> gen
-    n -> deep <$> (One <$> gen) <*> genSizedFingerTree (n `div` 2) (genSizedNode (n `div` 2) gen) <*> (One <$> gen)
+    o -> deep <$> (One <$> gen) <*> genSizedFingerTree (o `div` 2) (genSizedNode (o `div` 2) gen) <*> (One <$> gen)
 
 shrinkNode :: Measured v a => Node v a -> [Node v a]
-shrinkNode (Node2 _ a b) = []
+shrinkNode (Node2 _ _ _  ) = []
 shrinkNode (Node3 _ a b c) = [node2 a  b, node2 a c, node2 b c]
 
 genSizedNode :: (MonadGen m, Measured v a) => Size -> m a -> m (Node v a)
@@ -49,7 +49,7 @@
     ]
 
 shrinkDigit :: Digit a -> [Digit a]
-shrinkDigit (One a)         = []
-shrinkDigit (Two a b)       = [One a, One b]
-shrinkDigit (Three a b c)   = [Two a b, Two a c, Two b c]
-shrinkDigit (Four a b c d)  = [Three a b c, Three a b d, Three a c d, Three b c d]
+shrinkDigit (One    _      ) = []
+shrinkDigit (Two    a b    ) = [One a, One b]
+shrinkDigit (Three  a b c  ) = [Two a b, Two a c, Two b c]
+shrinkDigit (Four   a b c d) = [Three a b c, Three a b d, Three a c d, Three b c d]
diff --git a/tests/HaskellWorks/Data/FingerTreeSpec.hs b/tests/HaskellWorks/Data/FingerTreeSpec.hs
--- a/tests/HaskellWorks/Data/FingerTreeSpec.hs
+++ b/tests/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
 import HaskellWorks.Hspec.Hedgehog
@@ -118,9 +117,9 @@
     toList' (evalM (traverse' f xs)) ~== evalM (traverse f (toList xs))
   it "traverseWithPos" $ require $ property $ do
     xs <- forAll (G.fingerTree (G.int R.constantBounded))
-    let f xs y = do
+    let f ys y = do
           n <- step
-          return (xs, n, y)
+          return (ys, n, y)
     let xs_list = toList xs
     toList' (evalM (traverseWithPos f xs)) ~== evalM (traverse (uncurry f) (zip (inits xs_list) xs_list))
 
