diff --git a/haddock-library/haddock-library.cabal b/haddock-library/haddock-library.cabal
index 0b4405b9d24dd0d05e004f0bae20bad63fbebb29..b19642abfcdf0cf503631e41657eec2ca66aaecf 100644
--- a/haddock-library/haddock-library.cabal
+++ b/haddock-library/haddock-library.cabal
@@ -1,33 +1,42 @@
-cabal-version:        2.0
+cabal-version:        2.2
 name:                 haddock-library
 version:              1.7.0
 synopsis:             Library exposing some functionality of Haddock.
+
 description:          Haddock is a documentation-generation tool for Haskell
-                      libraries. These modules expose some functionality of it
-                      without pulling in the GHC dependency. Please note that the
-                      API is likely to change so specify upper bounds in your
-                      project. For interacting with Haddock
+                      libraries. These modules expose some
+                      functionality of it without pulling in the GHC
+                      dependency. Please note that the API is likely
+                      to change so be sure to specify upper bounds in
+                      your projects. For interacting with Haddock
                       itself, see the [haddock package](https://hackage.haskell.org/package/haddock).
-license:              BSD3
+
+license:              BSD-2-Clause
 license-files:        LICENSE
 maintainer:           Alec Theriault <alec.theriault@gmail.com>, Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>
 homepage:             http://www.haskell.org/haddock/
 bug-reports:          https://github.com/haskell/haddock/issues
 category:             Documentation
-build-type:           Simple
 extra-source-files:
   CHANGES.md
 
-library
-  default-language:     Haskell2010
+common lib-defaults
+  default-language: Haskell2010
 
   build-depends:
-      base         >= 4.5     && < 4.13
-    , bytestring   >= 0.9.2.1 && < 0.11
-    , containers   >= 0.4.2.1 && < 0.7
-    , transformers >= 0.3.0   && < 0.6
-    , text         >= 1.2.3.0  && < 1.3
-    , parsec       >= 3.1.13.0 && < 3.2
+    , base         >= 4.5     && < 4.14
+    , bytestring   ^>= 0.9.2.1 || ^>= 0.10.0.0
+    , containers   ^>= 0.4.2.1 || ^>= 0.5.0.0 || ^>= 0.6.0.1
+    , transformers ^>= 0.3.0.0 || ^>= 0.4.1.0 || ^>= 0.5.0.0
+    , text         ^>= 1.2.3.0
+    , parsec       ^>= 3.1.13.0
+
+  ghc-options: -funbox-strict-fields -Wall -fwarn-tabs
+  if impl(ghc >= 8.0)
+    ghc-options: -Wcompat -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
+
+library
+  import: lib-defaults
 
   hs-source-dirs:       src
 
@@ -42,25 +51,20 @@ library
     Documentation.Haddock.Parser.Util
     Documentation.Haddock.Parser.Monad
 
-  ghc-options: -funbox-strict-fields -Wall -fwarn-tabs
-  if impl(ghc >= 8.0)
-    ghc-options: -Wcompat -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
-
-
 test-suite spec
+  import: lib-defaults
   type:             exitcode-stdio-1.0
-  default-language: Haskell2010
   main-is:          Spec.hs
   hs-source-dirs:
       test
-    , src
-  ghc-options: -Wall
+      src
 
   cpp-options:
       -DTEST
 
   other-modules:
       Documentation.Haddock.Doc
+      Documentation.Haddock.Markup
       Documentation.Haddock.Parser
       Documentation.Haddock.Parser.Monad
       Documentation.Haddock.Parser.Util
@@ -71,39 +75,40 @@ test-suite spec
       Documentation.Haddock.Utf8Spec
 
   build-depends:
-      base         >= 4.5     && < 4.13
-    , base-compat  >= 0.9.3   && < 0.11
-    , bytestring   >= 0.9.2.1 && < 0.11
-    , containers   >= 0.4.2.1 && < 0.7
-    , transformers   >= 0.3.0   && < 0.6
-    , hspec        >= 2.4.4   && < 2.6
-    , QuickCheck    ^>= 2.11
-    , text         >= 1.2.3.0  && < 1.3
-    , parsec       >= 3.1.13.0 && < 3.2
-    , deepseq      >= 1.3     && < 1.5
+    , base-compat  ^>= 0.9.3 || ^>= 0.10.0
+    , QuickCheck   ^>= 2.11.3
+    , deepseq      ^>= 1.3.0.0 || ^>= 1.4.0.0
+
+  -- NB: build-depends & build-tool-depends have independent
+  --     install-plans, so it's best to limit to a single major
+  --     version of `hspec` & `hspec-discover` to ensure
+  --     intercompatibility
+  build-depends:
+    , hspec                         ^>= 2.5.5
 
   build-tool-depends:
-    hspec-discover:hspec-discover >= 2.4.4 && < 2.6
+    , hspec-discover:hspec-discover ^>= 2.5.5
 
 test-suite fixtures
   type:             exitcode-stdio-1.0
   default-language: Haskell2010
   main-is:          Fixtures.hs
-  ghc-options:      -Wall -O0
+  ghc-options:      -Wall
   hs-source-dirs:   fixtures
   buildable:        False
   build-depends:
-      base         >= 4.5     && < 4.13
+      -- intra-package dependency
+    , haddock-library
+      -- constraints inherited via lib:haddock-library component
+    , base
+
+      -- extra dependencies
     , base-compat  >= 0.9.3   && < 0.11
     , directory             ^>= 1.3.0.2
     , filepath              ^>= 1.4.1.2
     , optparse-applicative  ^>= 0.14.0.0
     , tree-diff             ^>= 0.0.0.1
 
-  -- Depend on the library.
-  build-depends:
-    haddock-library
-
 source-repository head
   type:     git
   subdir:   haddock-library