diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,19 @@
 
 ## [Unreleased]
 
+## [1.0.0.3] - 2026-11-07
+
+### Added
+
+- Add GitHub Actions continuous integration with GHC 9.14.
+- Declare `hspec-discover` as an explicit test build tool.
+
 ### Changed
+
+- Require Cabal 2.0 to support the explicit build-tool declaration.
+- Raise the upper bounds of `doclayout` and `QuickCheck`.
+- Add an upper bound for `text`.
+- Improve Haddock coverage and repair documentation links.
 
 ## [1.0.0.2] - 2025-05-18
 
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/src/Text/Layout/Table.hs b/src/Text/Layout/Table.hs
--- a/src/Text/Layout/Table.hs
+++ b/src/Text/Layout/Table.hs
@@ -253,6 +253,7 @@
 gridString :: Cell a => [ColSpec] -> [Row a] -> String
 gridString = gridStringB
 
+-- | Concatenate rendered lines with newline characters between them.
 concatLines :: StringBuilder b => [b] -> b
 concatLines = mconcat . intersperse (charB '\n')
 
diff --git a/src/Text/Layout/Table/Cell.hs b/src/Text/Layout/Table/Cell.hs
--- a/src/Text/Layout/Table/Cell.hs
+++ b/src/Text/Layout/Table/Cell.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE RecordWildCards   #-}
 
+-- | Cell measurement, padding, trimming, and alignment primitives.
 module Text.Layout.Table.Cell where
 
 import Control.Monad (join)
@@ -142,7 +143,7 @@
 --
 -- Used to define instances of 'Cell'.
 buildCellViewLRHelper :: StringBuilder b
-                      => (a -> b)  -- ^ Builder function for 'a'.
+                      => (a -> b)  -- ^ Builder function for @a@.
                       -> (Int -> a -> a)  -- ^ Function for trimming on the left.
                       -> (Int -> a -> a)  -- ^ Function for trimming on the right.
                       -> CellView a
@@ -156,7 +157,7 @@
 -- Used to define instanced of 'Cell'.
 buildCellViewBothHelper
     :: StringBuilder b
-    => (a -> b)  -- ^ Builder function for 'a'.
+    => (a -> b)  -- ^ Builder function for @a@.
     -> (Int -> Int -> a -> a)  -- ^ Function for trimming on the left and right simultaneously.
     -> CellView a
     -> b
@@ -168,7 +169,7 @@
 -- Used to define instances of 'Cell'.
 buildCellViewHelper
     :: StringBuilder b
-    => (a -> b)  -- ^ Builder function for 'a'.
+    => (a -> b)  -- ^ Builder function for @a@.
     -> (Int -> a -> b)  -- ^ Function for trimming on the left.
     -> (Int -> a -> b)  -- ^ Function for trimming on the right.
     -> (Int -> Int -> a -> b)  -- ^ Function for trimming on the left and right simultaneously.
@@ -264,10 +265,10 @@
   where
     k = visibleLength c
 
--- | If the given text is too long, it will be trimmed to length `upper`
+-- | If the given text is too long, it will be trimmed to length @upper@
 -- according to the position specification, and cut marks will be added to
 -- indicate that the column has been trimmed in length. Otherwise, if
--- the given text is too short, it will be padded to length `lower`.
+-- the given text is too short, it will be padded to length @lower@.
 --
 -- >>> let cm = singleCutMark ".."
 -- >>> buildCellMod cm $ trimOrPadBetween left cm 7 10 "A longer text." :: String
@@ -285,8 +286,8 @@
     :: Cell a
     => Position o
     -> CutMark
-    -> Int  -- ^ The length `lower` to pad to if too short
-    -> Int  -- ^ The length `upper` to trim to if too long
+    -> Int  -- ^ The length @lower@ to pad to if too short
+    -> Int  -- ^ The length @upper@ to trim to if too long
     -> a
     -> CellMod a
 trimOrPadBetween p cutMark lower upper c
@@ -341,24 +342,28 @@
 align oS (AlignInfo ln optRN) c = case measureAlignment (predicate oS) c of
     AlignInfo lk optRK -> padCell (truncateNegative $ ln - lk) (truncateNegative $ maybe 0 succ optRN - maybe 0 succ optRK) c
 
+-- | Padding or trimming required on one side of a cell.
 data CutAction
     = FillCA Int
     | CutCA Int
     | NoneCA
     deriving (Eq, Show)
 
+-- | Convert a cut action to its signed space adjustment.
 surplusSpace :: CutAction -> Int
 surplusSpace ca = case ca of
     CutCA n  -> negate n
     FillCA n -> n
     _        -> 0
 
+-- | Determine how to reconcile a required width with an actual width.
 determineCutAction :: Int -> Int -> CutAction
 determineCutAction requiredW actualW = case compare requiredW actualW of
     LT -> CutCA $ actualW - requiredW
     EQ -> NoneCA
     GT -> FillCA $ requiredW - actualW
 
+-- | Actions required after comparing a visible range with a cell range.
 data CutInfo
     -- | Apply a cut action to each side.
     = SidesCI CutAction CutAction
@@ -385,6 +390,8 @@
     s = surplusSpace ca
     r = cellLen - cutAmount
 
+-- | Convert cut information into a concrete cell modification, distributing
+-- available cut-mark space between the affected sides.
 applyCutInfo
     :: Cell a
     => CutInfo
diff --git a/src/Text/Layout/Table/Cell/Formatted.hs b/src/Text/Layout/Table/Cell/Formatted.hs
--- a/src/Text/Layout/Table/Cell/Formatted.hs
+++ b/src/Text/Layout/Table/Cell/Formatted.hs
@@ -26,6 +26,8 @@
 import Text.Layout.Table.Cell
 import Text.Layout.Table.StringBuilder
 
+-- | Content interleaved with backend-specific prefix and suffix formatting
+-- directives.
 data Formatted a
     = Empty
     | Concat [Formatted a]
diff --git a/src/Text/Layout/Table/Cell/WideString.hs b/src/Text/Layout/Table/Cell/WideString.hs
--- a/src/Text/Layout/Table/Cell/WideString.hs
+++ b/src/Text/Layout/Table/Cell/WideString.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE GeneralisedNewtypeDeriving #-}
 {-# LANGUAGE MultiWayIf                 #-}
 {-# LANGUAGE OverloadedStrings          #-}
+-- | Cell wrappers that measure Unicode characters by display width.
 module Text.Layout.Table.Cell.WideString
     ( WideString(..)
     , WideText(..)
@@ -13,7 +14,7 @@
 import Text.Layout.Table.Cell
 import Text.Layout.Table.Primitives.AlignInfo
 
--- | A newtype for String in which characters can be wider than one space.
+-- | A newtype for 'String' in which characters can be wider than one space.
 newtype WideString = WideString String
     deriving (Eq, Ord, Show, Read, Semigroup, Monoid, IsString)
 
@@ -47,7 +48,8 @@
         []      -> Nothing
         _ : rs' -> Just $ realLength rs'
 
--- | A newtype for Text in which characters can be wider than one space.
+-- | A newtype for strict 'T.Text' in which characters can be wider than one
+-- space.
 newtype WideText = WideText T.Text
     deriving (Eq, Ord, Show, Read, Semigroup, Monoid, IsString)
 
diff --git a/src/Text/Layout/Table/Justify.hs b/src/Text/Layout/Table/Justify.hs
--- a/src/Text/Layout/Table/Justify.hs
+++ b/src/Text/Layout/Table/Justify.hs
@@ -1,5 +1,5 @@
 -- | Produce justified text, which is spread over multiple rows. For a simple
--- cut, 'chunksOf' from the `split` package is best suited.
+-- cut, the @chunksOf@ function from the @split@ package is best suited.
 {-# LANGUAGE MultiWayIf #-}
 {-# LANGUAGE RecordWildCards #-}
 module Text.Layout.Table.Justify
@@ -103,8 +103,8 @@
     go y []        = [g y]
     go y (y' : ys) = f y : go y' ys
 
--- | Spread out spaces with different widths more evenly (in comparison to
--- 'dimorphicSpaces').
+-- | Spread out spaces with different widths more evenly than grouping all
+-- wider spaces before the narrower ones.
 mixedDimorphicSpaces :: Int -> Int -> [String]
 mixedDimorphicSpaces = mixedDimorphicSummandsBy spaces
 
@@ -118,6 +118,8 @@
 dimorphicSummands :: Int -> Int -> [Int]
 dimorphicSummands = dimorphicSummandsBy id
 
+-- | Split a number into almost-equal summands and transform each summand.
+-- Larger summands precede smaller ones.
 dimorphicSummandsBy :: (Int -> a) -> Int -> Int -> [a]
 dimorphicSummandsBy _ _ 0      = []
 dimorphicSummandsBy f n splits = replicate r largeS ++ replicate (splits - r) smallS
diff --git a/src/Text/Layout/Table/LineStyle.hs b/src/Text/Layout/Table/LineStyle.hs
--- a/src/Text/Layout/Table/LineStyle.hs
+++ b/src/Text/Layout/Table/LineStyle.hs
@@ -1,3 +1,4 @@
+-- | Line styles and join characters for drawing ASCII and Unicode tables.
 module Text.Layout.Table.LineStyle
     ( -- * Line Styling
       LineStyle(..)
@@ -217,11 +218,11 @@
 --
 -- Not all joins are fully supported by Unicode, and in these cases we try to
 -- gracefully substitute a similar character.
--- - Any join consisting solely of 'NoJoin', 'Light, and 'Heavy' is fully supported.
--- - Most joins consisting solely of 'NoJoin', 'Light, and 'Double' are supported.
---   For those that aren't, we substitute 'Heavy' for 'Double'.
--- - Any join which has both 'Heavy' and 'Double' is unsupported, and we
---   substitute 'Heavy' for 'Double'.
+-- - Any join consisting solely of @NoJoin@, @Light@, and @Heavy@ is fully supported.
+-- - Most joins consisting solely of @NoJoin@, @Light@, and @Double@ are supported.
+--   For those that aren't, we substitute @Heavy@ for @Double@.
+-- - Any join which has both @Heavy@ and @Double@ is unsupported, and we
+--   substitute @Heavy@ for @Double@.
 uJoins :: UnicodeJoin -> UnicodeJoin -> UnicodeJoin -> UnicodeJoin -> Char
 -- All NoJoin, 1 case
 uJoins NoJoin NoJoin NoJoin NoJoin = ' '
diff --git a/src/Text/Layout/Table/Primitives/AlignInfo.hs b/src/Text/Layout/Table/Primitives/AlignInfo.hs
--- a/src/Text/Layout/Table/Primitives/AlignInfo.hs
+++ b/src/Text/Layout/Table/Primitives/AlignInfo.hs
@@ -1,3 +1,4 @@
+-- | Measurements used to align cells around a matching character.
 module Text.Layout.Table.Primitives.AlignInfo where
 
 import Data.Foldable (asum)
diff --git a/src/Text/Layout/Table/Primitives/Basic.hs b/src/Text/Layout/Table/Primitives/Basic.hs
--- a/src/Text/Layout/Table/Primitives/Basic.hs
+++ b/src/Text/Layout/Table/Primitives/Basic.hs
@@ -29,18 +29,25 @@
 
 import Text.Layout.Table.Spec.CutMark
 
+-- | Produce the requested number of spaces.
 spaces :: Int -> String
 spaces = flip replicate ' '
 
+-- | Pad the beginning of a list to a target length, given its current length.
 fillStart' :: a -> Int -> Int -> [a] -> [a]
 fillStart' x i lenL l = replicate (i - lenL) x ++ l
 
+-- | Pad the beginning of a list to a target length.
 fillStart :: a -> Int -> [a] -> [a]
 fillStart x i l = fillStart' x i (length l) l
 
+-- | Pad the end of a list to a target length.
 fillEnd :: a -> Int -> [a] -> [a]
 fillEnd x i l = take i $ l ++ repeat x
 
+-- | Pad both ends of a list to a target length, given its current length.
+-- When an odd number of elements is required, the beginning receives the
+-- extra element.
 fillBoth' :: a -> Int -> Int -> [a] -> [a]
 fillBoth' x i lenL l = 
     -- Puts more on the beginning if odd.
@@ -50,9 +57,11 @@
     missing = i - lenL
     (q, r)  = missing `divMod` 2
 
+-- | Pad both ends of a list to a target length.
 fillBoth :: a -> Int -> [a] -> [a]
 fillBoth x i l = fillBoth' x i (length l) l
 
+-- | Pad the left of a 'String' to a target length, given its current length.
 fillLeft' :: Int -> Int -> String -> String
 fillLeft' = fillStart' ' '
 
@@ -64,6 +73,7 @@
 fillRight :: Int -> String -> String
 fillRight = fillEnd ' '
 
+-- | Pad both sides of a 'String' to a target length, given its current length.
 fillCenter' :: Int -> Int -> String -> String
 fillCenter' = fillBoth' ' '
 
diff --git a/src/Text/Layout/Table/Primitives/CellMod.hs b/src/Text/Layout/Table/Primitives/CellMod.hs
--- a/src/Text/Layout/Table/Primitives/CellMod.hs
+++ b/src/Text/Layout/Table/Primitives/CellMod.hs
@@ -1,8 +1,9 @@
 {-# LANGUAGE DeriveFunctor #-}
+-- | A declarative description of padding and trimming applied to a cell.
 module Text.Layout.Table.Primitives.CellMod where
 
 -- | Provide all the information necessary to compare resulting dimensions and
--- to turn it into a 'StringBuilder'.
+-- to turn it into a string builder.
 data CellMod a =
     CellMod
     { baseCellCM :: a
@@ -41,6 +42,8 @@
 trimCellRight rightTrim rightCMLen =
     trimCell 0 rightTrim 0 rightCMLen
 
+-- | Construct a cell modification with explicit adjustments and cut-mark
+-- lengths for the left and right sides.
 modifyCellWithCutMarkLen :: Int -> Int -> Int -> Int -> a -> CellMod a
 modifyCellWithCutMarkLen la ra lc rc c = CellMod c la ra lc rc
 
@@ -49,6 +52,7 @@
 modifyCell :: Int -> Int -> a -> CellMod a
 modifyCell la ra = modifyCellWithCutMarkLen la ra 0 0
 
+-- | Keep a cell unchanged.
 keepCell :: a -> CellMod a
 keepCell = modifyCellWithCutMarkLen 0 0 0 0
 
diff --git a/src/Text/Layout/Table/Primitives/ColumnModifier.hs b/src/Text/Layout/Table/Primitives/ColumnModifier.hs
--- a/src/Text/Layout/Table/Primitives/ColumnModifier.hs
+++ b/src/Text/Layout/Table/Primitives/ColumnModifier.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE RankNTypes #-}
+-- | Derivation and application of uniform column modifications.
 module Text.Layout.Table.Primitives.ColumnModifier where
 
 import Control.Arrow ((&&&))
@@ -79,7 +80,7 @@
 fitTitlesCMI = zipWith3 ensureWidthOfCMI
 
 -- | Generates a function which modifies a given cell according to
--- 'Text.Layout.Table.Position.Position', 'CutMark' and 'ColModInfo'. This is
+-- 'Position', 'CutMark' and 'ColModInfo'. This is
 -- used to modify a single cell of a column to bring all cells of a column to
 -- the same width.
 columnModifier
@@ -98,6 +99,7 @@
 deriveAlignInfo :: Cell a => OccSpec -> a -> AlignInfo
 deriveAlignInfo occSpec = measureAlignment (predicate occSpec)
 
+-- | Extract the length and alignment policies from column specifications.
 unpackColSpecs :: [ColSpec] -> [(LenSpec, AlignSpec)]
 unpackColSpecs = fmap $ lenSpec &&& alignSpec
 
diff --git a/src/Text/Layout/Table/Primitives/Header.hs b/src/Text/Layout/Table/Primitives/Header.hs
--- a/src/Text/Layout/Table/Primitives/Header.hs
+++ b/src/Text/Layout/Table/Primitives/Header.hs
@@ -1,3 +1,4 @@
+-- | Applying header-column specifications to derived column widths.
 module Text.Layout.Table.Primitives.Header where
 
 import Data.Maybe
diff --git a/src/Text/Layout/Table/Primitives/Table.hs b/src/Text/Layout/Table/Primitives/Table.hs
--- a/src/Text/Layout/Table/Primitives/Table.hs
+++ b/src/Text/Layout/Table/Primitives/Table.hs
@@ -11,7 +11,7 @@
 
 
 -- | Draw a horizontal line that will use the provided delimiters around
--- the content appropriately and visually separate by 'hSpace'.
+-- the content appropriately and visually separate by @hSpace@.
 horizontalDetailLine
     :: StringBuilder b
     => String                            -- ^ The space characters that are used as padding.
diff --git a/src/Text/Layout/Table/Spec/AlignSpec.hs b/src/Text/Layout/Table/Spec/AlignSpec.hs
--- a/src/Text/Layout/Table/Spec/AlignSpec.hs
+++ b/src/Text/Layout/Table/Spec/AlignSpec.hs
@@ -1,3 +1,4 @@
+-- | Policies for aligning cells at matching characters.
 module Text.Layout.Table.Spec.AlignSpec
     ( AlignSpec(..)
     , noAlign
diff --git a/src/Text/Layout/Table/Spec/ColSpec.hs b/src/Text/Layout/Table/Spec/ColSpec.hs
--- a/src/Text/Layout/Table/Spec/ColSpec.hs
+++ b/src/Text/Layout/Table/Spec/ColSpec.hs
@@ -1,3 +1,4 @@
+-- | Complete layout specifications for table columns.
 module Text.Layout.Table.Spec.ColSpec
     ( ColSpec
     , lenSpec
@@ -23,9 +24,13 @@
 data ColSpec
     = ColSpec
     { lenSpec     :: LenSpec
+      -- ^ Policy for choosing the column width.
     , position    :: Position H
+      -- ^ Horizontal position of cell content.
     , alignSpec   :: AlignSpec
+      -- ^ Character-alignment policy for the column.
     , cutMark     :: CutMark
+      -- ^ Marks used when cell content is trimmed.
     }
 
 instance Default ColSpec where
diff --git a/src/Text/Layout/Table/Spec/CutMark.hs b/src/Text/Layout/Table/Spec/CutMark.hs
--- a/src/Text/Layout/Table/Spec/CutMark.hs
+++ b/src/Text/Layout/Table/Spec/CutMark.hs
@@ -1,4 +1,5 @@
 -- TODO rename cut marks (they are too long)
+-- | Cut marks used to indicate content trimmed from table cells.
 module Text.Layout.Table.Spec.CutMark
     ( CutMark
     , doubleCutMark
@@ -17,7 +18,9 @@
 data CutMark
     = CutMark
     { leftMark  :: String
+      -- ^ Mark displayed when content is removed from the left.
     , rightMark :: String
+      -- ^ Mark displayed when content is removed from the right.
     } deriving (Show, Eq)
 
 -- | A single ellipsis unicode character is used to show cut marks.
diff --git a/src/Text/Layout/Table/Spec/HeaderColSpec.hs b/src/Text/Layout/Table/Spec/HeaderColSpec.hs
--- a/src/Text/Layout/Table/Spec/HeaderColSpec.hs
+++ b/src/Text/Layout/Table/Spec/HeaderColSpec.hs
@@ -1,3 +1,4 @@
+-- | Specifications for positioning and trimming header cells.
 module Text.Layout.Table.Spec.HeaderColSpec where
 
 import Data.Default.Class
diff --git a/src/Text/Layout/Table/Spec/HeaderSpec.hs b/src/Text/Layout/Table/Spec/HeaderSpec.hs
--- a/src/Text/Layout/Table/Spec/HeaderSpec.hs
+++ b/src/Text/Layout/Table/Spec/HeaderSpec.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE DeriveTraversable #-}
 
+-- | Hierarchical specifications for optional row and column headers.
 module Text.Layout.Table.Spec.HeaderSpec where
 
 import Data.Bifunctor
diff --git a/src/Text/Layout/Table/Spec/LenSpec.hs b/src/Text/Layout/Table/Spec/LenSpec.hs
--- a/src/Text/Layout/Table/Spec/LenSpec.hs
+++ b/src/Text/Layout/Table/Spec/LenSpec.hs
@@ -1,3 +1,4 @@
+-- | Policies for choosing the rendered width of a column.
 module Text.Layout.Table.Spec.LenSpec
     ( LenSpec (..)
     , expand
diff --git a/src/Text/Layout/Table/Spec/OccSpec.hs b/src/Text/Layout/Table/Spec/OccSpec.hs
--- a/src/Text/Layout/Table/Spec/OccSpec.hs
+++ b/src/Text/Layout/Table/Spec/OccSpec.hs
@@ -1,3 +1,4 @@
+-- | Specifications for locating an occurrence used for cell alignment.
 module Text.Layout.Table.Spec.OccSpec
     ( OccSpec
     , predOccSpec
@@ -10,6 +11,7 @@
 -- | Specifies an occurence of a letter.
 data OccSpec = OccSpec (Char -> Bool) Int
 
+-- | Extract the character predicate from an occurrence specification.
 predicate :: OccSpec -> (Char -> Bool)
 predicate (OccSpec p _) = p
 
diff --git a/src/Text/Layout/Table/Spec/Position.hs b/src/Text/Layout/Table/Spec/Position.hs
--- a/src/Text/Layout/Table/Spec/Position.hs
+++ b/src/Text/Layout/Table/Spec/Position.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE EmptyDataDecls #-}
+-- | Horizontal and vertical positions used when laying out cells.
 module Text.Layout.Table.Spec.Position where
 
 import Data.Default.Class
@@ -37,17 +38,22 @@
 -- | Vertical orientation.
 data V
 
+-- | Position content at the left edge.
 left :: Position H
 left = Start
 
+-- | Position content at the right edge.
 right :: Position H
 right = End
 
+-- | Position content in the center of either orientation.
 center :: Position orientation
 center = Center
 
+-- | Position content at the top edge.
 top :: Position V
 top = Start
 
+-- | Position content at the bottom edge.
 bottom :: Position V
 bottom = End
diff --git a/src/Text/Layout/Table/Spec/RowGroup.hs b/src/Text/Layout/Table/Spec/RowGroup.hs
--- a/src/Text/Layout/Table/Spec/RowGroup.hs
+++ b/src/Text/Layout/Table/Spec/RowGroup.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE DeriveFunctor #-}
 {-# LANGUAGE DeriveFoldable #-}
+-- | Row groups and their column-oriented representations.
 module Text.Layout.Table.Spec.RowGroup where
 
 import Text.Layout.Table.Spec.Util
@@ -36,15 +37,18 @@
         r : _ -> void r
         []    -> []
 
+-- | One vertically arranged segment obtained from a particular kind of
+-- 'RowGroup'.
 data ColumnSegment a
     = SingleValueSegment a
     | ColumnSegment (Col a)
     | NullableColumnSegment (Col (Maybe a))
     deriving (Functor, Foldable, Eq, Show)
 
+-- | A column split into segments that retain the grouping of its source rows.
 newtype SegmentedColumn a = SegmentedColumn [ColumnSegment a] deriving (Functor, Foldable, Eq, Show)
 
--- | Break down several 'RowGroups', which conceptually form a column by
+-- | Break down several 'RowGroup' values, which conceptually form a column by
 -- themselves, into a list of columns.
 transposeRowGroups :: Col (RowGroup a) -> [SegmentedColumn a]
 transposeRowGroups = fmap SegmentedColumn . transpose . map transposeRowGroup
diff --git a/src/Text/Layout/Table/Spec/TableSpec.hs b/src/Text/Layout/Table/Spec/TableSpec.hs
--- a/src/Text/Layout/Table/Spec/TableSpec.hs
+++ b/src/Text/Layout/Table/Spec/TableSpec.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE RecordWildCards #-}
+-- | Complete specifications combining columns, headers, style, and row groups.
 module Text.Layout.Table.Spec.TableSpec where
 
 import Data.Default.Class
diff --git a/src/Text/Layout/Table/Spec/Util.hs b/src/Text/Layout/Table/Spec/Util.hs
--- a/src/Text/Layout/Table/Spec/Util.hs
+++ b/src/Text/Layout/Table/Spec/Util.hs
@@ -1,3 +1,4 @@
+-- | List aliases used to distinguish horizontal rows from vertical columns.
 module Text.Layout.Table.Spec.Util where
 
 -- | An alias for lists, conceptually for values with a horizontal arrangement.
diff --git a/src/Text/Layout/Table/StringBuilder.hs b/src/Text/Layout/Table/StringBuilder.hs
--- a/src/Text/Layout/Table/StringBuilder.hs
+++ b/src/Text/Layout/Table/StringBuilder.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE FlexibleInstances #-}
+-- | Builders used as output targets when rendering tables.
 module Text.Layout.Table.StringBuilder where
 
 import Data.Semigroup
@@ -13,7 +14,7 @@
     -- | Create a builder with a single 'Char'.
     charB :: Char -> a
 
-    -- | Create a builder with a 'Text'.
+    -- | Create a builder with strict 'T.Text'.
     textB :: T.Text -> a
     textB = stringB . T.unpack
 
diff --git a/src/Text/Layout/Table/Style.hs b/src/Text/Layout/Table/Style.hs
--- a/src/Text/Layout/Table/Style.hs
+++ b/src/Text/Layout/Table/Style.hs
@@ -235,19 +235,21 @@
     , groupBottom       = groupStyle
     }
 
--- Generate an ASCII 'TableStyle' from a 'TableStyleSpec' using pluses for joins.
+-- | Generate an ASCII 'TableStyle' from a 'TableStyleSpec' using pluses for
+-- joins.
 asciiTableStyleFromSpec :: TableStyleSpec -> TableStyle LineStyle LineStyle
 asciiTableStyleFromSpec = tableStyleFromSpec asciiHorizontal asciiVertical asciiJoinString4
 
--- Generate an ASCII 'TableStyle' from a 'TableStyleSpec' using rounded joins.
+-- | Generate an ASCII 'TableStyle' from a 'TableStyleSpec' using rounded
+-- joins.
 roundedAsciiTableStyleFromSpec :: TableStyleSpec -> TableStyle LineStyle LineStyle
 roundedAsciiTableStyleFromSpec = tableStyleFromSpec asciiHorizontal asciiVertical roundedAsciiJoinString4
 
--- Generate a unicode 'TableStyle' from a 'TableStyleSpec'.
+-- | Generate a Unicode 'TableStyle' from a 'TableStyleSpec'.
 unicodeTableStyleFromSpec :: TableStyleSpec -> TableStyle LineStyle LineStyle
 unicodeTableStyleFromSpec = tableStyleFromSpec unicodeHorizontal unicodeVertical unicodeJoinString4
 
--- | Generate a 'TableStyle from a given 'TableStyleSpec', along with functions
+-- | Generate a 'TableStyle' from a given 'TableStyleSpec', along with functions
 -- to construct horizontal and vertical lines and joins.
 -- The function for constructing join strings takes its arguments in the order
 -- west, east, north, south.
diff --git a/table-layout.cabal b/table-layout.cabal
--- a/table-layout.cabal
+++ b/table-layout.cabal
@@ -6,7 +6,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             1.0.0.2
+version:             1.0.0.3
 
 synopsis:            Format tabular data as grid or table.
 
@@ -41,14 +41,15 @@
 build-type:            Simple
 -- Extra files to be distributed with the package, such as examples or a 
 -- README.
-extra-source-files:    README.md, CHANGELOG.md
+extra-source-files:    README.md
+extra-doc-files:       CHANGELOG.md
 
 -- Constraint on the version of Cabal needed to build this package.
-cabal-version:         >=1.10
+cabal-version:         2.0
 
 source-repository head
     type:              git
-    location:          git://github.com/muesli4/table-layout.git
+    location:          https://github.com/muesli4/table-layout.git
 
 
 library
@@ -95,8 +96,8 @@
   -- Other library packages from which modules are imported.
   build-depends:       base >=4.9 && <5,
                        data-default-class >=0.1.2 && < 0.3,
-                       doclayout >=0.3 && <0.6,
-                       text
+                       doclayout >=0.3 && <0.7,
+                       text <2.2
 
   hs-source-dirs:      src
   
@@ -107,8 +108,8 @@
   main-is:             Test.hs
   build-depends:       base >=4.9 && <5,
                        data-default-class >=0.1.2 && < 0.3,
-                       doclayout >=0.3 && <0.6,
-                       text
+                       doclayout >=0.3 && <0.7,
+                       text <2.2
   hs-source-dirs:      src
   other-modules:       Text.Layout.Table,
                        Text.Layout.Table.Cell,
@@ -146,12 +147,13 @@
   hs-source-dirs:      test-suite, src
   main-is:             Spec.hs
   build-depends:       base >=4.9 && <5,
-                       QuickCheck >=2.8 && < 2.16,
+                       QuickCheck >=2.8 && < 2.20,
                        HUnit >=1.3,
                        data-default-class >=0.1.2 && < 0.3,
-                       doclayout >=0.3 && <0.6,
-                       text,
+                       doclayout >=0.3 && <0.7,
+                       text <2.2,
                        hspec
+  build-tool-depends:  hspec-discover:hspec-discover >=2 && <3
 
   other-modules:       TestSpec,
 
