diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,7 @@
+0.2.5.2 (2021.10.16):
+    - Increasing upper bounds to Hackage latest, instead of just GHC 9.0.1
 0.2.5.1 (2021.10.16):
-    - Fixing things to compile under GHC 9.0
+    - Fixing things to compile under GHC 9.0.1
 0.2.5.0 (2019.02.25):
     - Fixing things to compile under GHC 8.4 and 8.6.
 	- Adds Semigroup (Trie a) instance
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,9 +1,8 @@
 bytestring-trie
 ===============
 [![Hackage version](https://img.shields.io/hackage/v/bytestring-trie.svg?style=flat)](https://hackage.haskell.org/package/bytestring-trie) 
-[![Hackage-Deps](https://img.shields.io/hackage-deps/v/bytestring-trie.svg?style=flat)](http://packdeps.haskellers.com/specific?package=bytestring-trie)
-[![TravisCI Build Status](https://img.shields.io/travis/wrengr/bytestring-trie.svg?style=flat)](https://travis-ci.org/wrengr/bytestring-trie) 
-[![CircleCI Build Status](https://circleci.com/gh/wrengr/bytestring-trie.svg?style=shield&circle-token=b57517657c556be6fd8fca92b843f9e4cffaf8d1)](https://circleci.com/gh/wrengr/bytestring-trie)
+[![Build Status](https://github.com/wrengr/bytestring-trie/workflows/ci/badge.svg)](https://github.com/wrengr/bytestring-trie/actions?query=workflow%3Aci)
+[![Dependencies](https://img.shields.io/hackage-deps/v/bytestring-trie.svg?style=flat)](http://packdeps.haskellers.com/specific?package=bytestring-trie)
 
 The bytestring-trie package provides an efficient implementation
 of tries mapping `ByteString` to values.  The implementation is
diff --git a/bytestring-trie.cabal b/bytestring-trie.cabal
--- a/bytestring-trie.cabal
+++ b/bytestring-trie.cabal
@@ -7,7 +7,7 @@
 Build-Type:     Simple
 
 Name:           bytestring-trie
-Version:        0.2.5.1
+Version:        0.2.5.2
 Stability:      provisional
 Homepage:       http://wrengr.org
 Author:         wren gayle romano
@@ -43,16 +43,15 @@
 Extra-source-files:
     AUTHORS, CHANGELOG, README.md
 
--- Cf., <https://travis-ci.org/wrengr/bytestring-lexing>
+-- This should work as far back as GHC 7.4.1, but we don't verify that by CI.
+-- TODO: add the github-actions link.
 Tested-With:
-    GHC ==7.4.1, GHC ==7.4.2,
-    GHC ==7.6.1, GHC ==7.6.2, GHC ==7.6.3,
-    GHC ==7.8.1, GHC ==7.8.2, GHC ==7.8.3, GHC ==7.8.4,
-    GHC ==7.10.1, GHC ==7.10.2, GHC ==7.10.3,
-    GHC ==8.0.1, GHC ==8.0.2,
-    GHC ==8.2.1, GHC ==8.2.2,
-    GHC ==8.4.1, GHC ==8.4.2, GHC ==8.4.3,
-    GHC ==8.6.1, GHC ==8.6.2,
+    GHC ==8.0.2,
+    GHC ==8.2.2,
+    GHC ==8.4.4,
+    GHC ==8.6.5,
+    GHC ==8.8.4,
+    GHC ==8.10.3,
     GHC ==9.0.1
 
 Source-Repository head
@@ -73,8 +72,8 @@
     -- But then, we don't maintain any CI tests for older
     -- versions, so these are the lowest bounds we've verified.
     Build-Depends: base       >= 4.5   && < 4.16
-                 , bytestring >= 0.9.2 && < 0.11
-                 , binary     >= 0.5.1 && < 0.8.9
+                 , bytestring >= 0.9.2 && < 0.12
+                 , binary     >= 0.5.1 && < 0.11
     
 ------------------------------------------------------------
 ------------------------------------------------------- fin.
diff --git a/src/Data/Trie.hs b/src/Data/Trie.hs
--- a/src/Data/Trie.hs
+++ b/src/Data/Trie.hs
@@ -37,22 +37,22 @@
     (
     -- * Data type
       Trie()
-    
+
     -- * Basic functions
     , empty, null, singleton, size
-    
+
     -- * Conversion functions
     , fromList, toListBy, toList, keys, elems
-    
+
     -- * Query functions
     , lookupBy, lookup, member, submap, match, matches
-    
+
     -- * Single-value modification
     , alterBy, insert, adjust, delete
-    
+
     -- * Combining tries
     , mergeBy, unionL, unionR
-    
+
     -- * Mapping functions
     , mapBy, filterMap
     ) where
@@ -71,7 +71,7 @@
 
 
 {---------------------------------------------------------------
--- Conversion functions 
+-- Conversion functions
 ---------------------------------------------------------------}
 
 -- | Convert association list into a trie. On key conflict, values
diff --git a/src/Data/Trie/BitTwiddle.hs b/src/Data/Trie/BitTwiddle.hs
--- a/src/Data/Trie/BitTwiddle.hs
+++ b/src/Data/Trie/BitTwiddle.hs
@@ -16,8 +16,8 @@
 -- Functions to treat 'Word' as a bit-vector for big-endian patricia
 -- trees. This code is duplicated from "Data.IntMap". The only
 -- differences are that some of the conversion functions are
--- specialized to 'Word8' for bytestrings, instead of being specialized
--- to 'Int'.
+-- specialized to 'Data.Word.Word8' for bytestrings, instead of
+-- being specialized to 'Int'.
 ----------------------------------------------------------------
 
 module Data.Trie.BitTwiddle
@@ -41,9 +41,9 @@
 
 ----------------------------------------------------------------
 
-type KeyElem = ByteStringElem 
-type Prefix  = KeyElem 
-type Mask    = KeyElem 
+type KeyElem = ByteStringElem
+type Prefix  = KeyElem
+type Mask    = KeyElem
 
 elemToNat :: KeyElem -> Word
 {-# INLINE elemToNat #-}
@@ -159,11 +159,11 @@
 highestBitMask :: Word -> Word
 {-# INLINE highestBitMask #-}
 highestBitMask x
-    = case (x .|. shiftRL x 1) of 
-       x -> case (x .|. shiftRL x 2) of 
-        x -> case (x .|. shiftRL x 4) of 
-         x -> case (x .|. shiftRL x 8) of 
-          x -> case (x .|. shiftRL x 16) of 
+    = case (x .|. shiftRL x 1) of
+       x -> case (x .|. shiftRL x 2) of
+        x -> case (x .|. shiftRL x 4) of
+         x -> case (x .|. shiftRL x 8) of
+          x -> case (x .|. shiftRL x 16) of
            x -> case (x .|. shiftRL x 32) of   -- for 64 bit platforms
             x -> (x `xor` shiftRL x 1)
 
diff --git a/src/Data/Trie/ByteStringInternal.hs b/src/Data/Trie/ByteStringInternal.hs
--- a/src/Data/Trie/ByteStringInternal.hs
+++ b/src/Data/Trie/ByteStringInternal.hs
@@ -62,7 +62,7 @@
             return $! (,,) !$ pre !$ s1' !$ s2'
 
 -- | Get the 'sizeOf' the type, without requiring @-XScopedTypeVariables@
--- nor making a spurious call to 'unsafePerformIO' or similar.
+-- nor making a spurious call to 'System.IO.Unsafe.unsafePerformIO' or similar.
 sizeOfPtr :: Storable a => Ptr a -> Int
 sizeOfPtr = sizeOf . (undefined :: Ptr a -> a)
 {-# INLINE sizeOfPtr #-}
diff --git a/src/Data/Trie/Convenience.hs b/src/Data/Trie/Convenience.hs
--- a/src/Data/Trie/Convenience.hs
+++ b/src/Data/Trie/Convenience.hs
@@ -24,19 +24,19 @@
       fromListL, fromListR, fromListS
     , fromListWith,  fromListWith'
     , fromListWithL, fromListWithL'
-    
+
     -- * Query functions ('lookupBy' variants)
     , lookupWithDefault
-    
+
     -- * Inserting values ('alterBy' variants)
     , insertIfAbsent
     , insertWith,    insertWith'
     , insertWithKey, insertWithKey'
-    
+
     -- * Updating and adjusting values ('alterBy' and 'adjustBy' variants)
     , adjustWithKey
     , update, updateWithKey
-    
+
     -- * Combining tries ('mergeBy' variants)
     , disunion
     , unionWith, unionWith'
@@ -92,7 +92,7 @@
 
 -- | A variant of 'fromListR' that takes a function for combining
 -- values on conflict. The first argument to the combining function
--- is the ``new'' value from the initial portion of the list; the
+-- is the \"new\" value from the initial portion of the list; the
 -- second argument is the value that has been accumulated into the
 -- trie from the tail of the list (just like the first argument to
 -- 'foldr'). Thus, @fromList = fromListWith const@.
@@ -120,7 +120,7 @@
 -- | A left-fold variant of 'fromListWith'. Note that the arguments
 -- to the combining function are swapped: the first is the value
 -- in the trie which has been accumulated from the initial part of
--- the list; the second argument is the ``new'' value from the
+-- the list; the second argument is the \"new\" value from the
 -- remaining tail of the list (just like the first argument to
 -- 'foldl'). Thus, @fromListL = fromListWithL const@.
 fromListWithL :: (a -> a -> a) -> [(ByteString,a)] -> Trie a
diff --git a/src/Data/Trie/Internal.hs b/src/Data/Trie/Internal.hs
--- a/src/Data/Trie/Internal.hs
+++ b/src/Data/Trie/Internal.hs
@@ -66,7 +66,7 @@
 import Data.Trie.ByteStringInternal
 import Data.Trie.BitTwiddle
 
-import Data.Binary
+import Data.Binary         (Binary(..), Get, Word8)
 #if MIN_VERSION_base(4,9,0)
 import Data.Semigroup      (Semigroup(..))
 #endif
@@ -993,6 +993,9 @@
 -- Priority-queue functions
 -----------------------------------------------------------}
 
+-- | Return the lexicographically smallest 'ByteString' and the
+-- value it's mapped to; or 'Nothing' for the empty trie.  When one
+-- entry is a prefix of another, the prefix will be returned.
 minAssoc :: Trie a -> Maybe (ByteString, a)
 minAssoc = go S.empty
     where
@@ -1002,6 +1005,9 @@
     go q (Branch _ _ l _)   = go q l
 
 
+-- | Return the lexicographically largest 'ByteString' and the
+-- value it's mapped to; or 'Nothing' for the empty trie.  When one
+-- entry is a prefix of another, the longer one will be returned.
 maxAssoc :: Trie a -> Maybe (ByteString, a)
 maxAssoc = go S.empty
     where
@@ -1017,6 +1023,7 @@
 mapView f (Just (k,v,t)) = Just (k,v, f t)
 
 
+-- | Update the 'minAssoc' and return the old 'minAssoc'.
 updateMinViewBy :: (ByteString -> a -> Maybe a)
                 -> Trie a -> Maybe (ByteString, a, Trie a)
 updateMinViewBy f = go S.empty
@@ -1028,6 +1035,7 @@
     go q (Branch p m l r)   = mapView (\l' -> branch p m l' r) (go q l)
 
 
+-- | Update the 'maxAssoc' and return the old 'maxAssoc'.
 updateMaxViewBy :: (ByteString -> a -> Maybe a)
                 -> Trie a -> Maybe (ByteString, a, Trie a)
 updateMaxViewBy f = go S.empty
