diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,14 +1,28 @@
+### 1.4.3.1
+
+_Andreas Abel, 2022-02-12_
+
+- Remove spurious dependency on `random`.
+- Bump upper bounds on `base` and `time`.
+- Tested with GHC 7.0 - 9.2.
+
 ### 1.4.3.0
 
+_Herbert Valerio Riedel, 2020-04-09_
+
 - New tuple construction helpers `Data.Tuple.Utils.dup` and `Data.Tuple.Utils.triple`
 - Close sockets on connection failure in `connectTCPAddr` ([#50](https://github.com/haskell-hvr/missingh/issues/50))
 
 ### 1.4.2.1
 
+_Herbert Valerio Riedel, 2019-05-20_
+
 - GHC 7.0 only compat release
 
 ## 1.4.2.0
 
+_Herbert Valerio Riedel, 2019-05-14_
+
 - Fix regression (introduced in 1.4.1.0 release) in `Data.Compression.Inflate`
 - Drop redundant dependency on `HUnit`
 - Add more explicit `SafeHaskell` annotations to modules; all modules
@@ -17,13 +31,19 @@
 
 ## 1.4.1.0
 
+_John Goerzen, 2018-10-13_
+
 - Support for GHC 8.6.1 / `base-4.12` ([#45](https://github.com/haskell-hvr/missingh/issues/45))
 
 ### 1.4.0.1
 
+_John Goerzen, 2016-06-15_
+
 - Restore compatibility with GHC 7.4.2
 
 # 1.4.0.0
+
+_John Goerzen, 2016-06-29_
 
 - Removal of `Data.Hash.CRC32.Posix` and `System.Time.Utils.ParseDate`
 
diff --git a/MissingH.cabal b/MissingH.cabal
--- a/MissingH.cabal
+++ b/MissingH.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.12
 name: MissingH
-version: 1.4.3.0
+version: 1.4.3.1
 
 build-type: Simple
 license: BSD3
@@ -8,8 +8,21 @@
 copyright: Copyright (c) 2004-2018 John Goerzen
 maintainer: Herbert Valerio Riedel <hvr@gnu.org>
 license-file: LICENSE
-tested-with: GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
 
+tested-with:
+  GHC == 9.2.1
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
+  GHC == 7.10.3
+  GHC == 7.8.4
+  GHC == 7.6.3
+  GHC == 7.4.2
+
 synopsis: Large utility library
 description:
   @MissingH@ is a library of all sorts of utility functions for Haskell
@@ -112,7 +125,7 @@
 
   build-depends:
       array               >= 0.4.0.0 && < 0.6
-    , base                >= 4.5.0.0 && < 4.15
+    , base                >= 4.5.0.0 && < 4.17
     , containers          >= 0.4.2.1 && < 0.7
     , directory           >= 1.1.0.2 && < 1.4
     , filepath            >= 1.3.0.0 && < 1.5
@@ -122,9 +135,8 @@
     , old-time            == 1.1.*
     , parsec              == 3.1.*   && (< 3.1.12 || >= 3.1.13)
     , process             >= 1.1.0.1 && < 1.7
-    , random              >= 1.0.1.1 && < 1.2
     , regex-compat        >= 0.95.1  && < 0.96
-    , time                >= 1.4     && < 1.10
+    , time                >= 1.4     && < 1.13
 
   if flag(network--GE-3_0_0)
     build-depends: network-bsd >= 2.8.1 && <2.9,
@@ -167,6 +179,8 @@
     WildMatchtest
 
   default-language: Haskell2010
+  other-extensions:
+    CPP
 
   -- intra-package dependency
   build-depends: MissingH
@@ -188,7 +202,10 @@
   -- additional testsuite-specific dependencies
   build-depends:
       HUnit                  == 1.6.*
---  , QuickCheck             == 2.7.*
-    , errorcall-eq-instance  == 0.3.*
+
+  if impl(ghc < 7.8)
+    -- really, we would like to test for base < 4.7
+    build-depends:
+      errorcall-eq-instance  == 0.3.*
 
   ghc-options: -fno-warn-deprecations
diff --git a/src/Control/Concurrent/Thread/Utils.hs b/src/Control/Concurrent/Thread/Utils.hs
--- a/src/Control/Concurrent/Thread/Utils.hs
+++ b/src/Control/Concurrent/Thread/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with threads.
diff --git a/src/Data/BinPacking.hs b/src/Data/BinPacking.hs
--- a/src/Data/BinPacking.hs
+++ b/src/Data/BinPacking.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2008-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Tools for packing into bins
@@ -39,10 +39,10 @@
 import Data.List
 import Control.Monad.Error
 
-{- | Potential errors returned as Left values by 'BinPacker' functions. 
+{- | Potential errors returned as Left values by 'BinPacker' functions.
 Calling 'show' on this value will produce a nice error message suitable for
 display. -}
-data (Num size, Ord size, Show size, Show obj) => BinPackerError size obj = 
+data (Num size, Ord size, Show size, Show obj) => BinPackerError size obj =
     BPTooFewBins [(size, obj)]                -- ^ Ran out of bins; attached value is the list of objects that do not fit
     | BPSizeTooLarge size (size, obj)   -- ^ Bin size1 exceeded by at least the given object and size
     | BPOther String                    -- ^ Other error
@@ -63,13 +63,13 @@
 
 These functions take a list of size of bins.  If every bin is the same size,
 you can pass @repeat binSize@ to pass an infinite list of bins if the
-same size.  Any surplus bins will simply be ignored. 
+same size.  Any surplus bins will simply be ignored.
 
 > [size] is the sizes of bins
 > [(size, obj)] is the sizes and objects
 > result is Either error or results
 -}
-type BinPacker = forall size obj. (Num size, Ord size, Show size, Show obj) => 
+type BinPacker = forall size obj. (Num size, Ord size, Show size, Show obj) =>
                   [size]        -- The sizes of bins
                -> [(size, obj)] -- The sizes and objects
                -> Either (BinPackerError size obj) [[(size, obj)]] -- Either error or results
@@ -85,7 +85,7 @@
 packByOrder [] remainder = Left (BPTooFewBins remainder)
 packByOrder (thisbinsize:otherbins) sizes =
     let fillBin _ [] = Right []
-        fillBin accumsize ((s, o):xs) 
+        fillBin accumsize ((s, o):xs)
             | s > thisbinsize = Left $ BPSizeTooLarge thisbinsize (s, o)
             | s + accumsize > thisbinsize = Right []
             | otherwise = do next <- fillBin (accumsize + s) xs
diff --git a/src/Data/Bits/Utils.hs b/src/Data/Bits/Utils.hs
--- a/src/Data/Bits/Utils.hs
+++ b/src/Data/Bits/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable to platforms with rawSystem
 
   Bit-related utilities
diff --git a/src/Data/CSV.hs b/src/Data/CSV.hs
--- a/src/Data/CSV.hs
+++ b/src/Data/CSV.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Haskell Parsec parsers for comma-separated value (CSV) files.
diff --git a/src/Data/Compression/Inflate.hs b/src/Data/Compression/Inflate.hs
--- a/src/Data/Compression/Inflate.hs
+++ b/src/Data/Compression/Inflate.hs
@@ -19,7 +19,7 @@
    Copyright  : Copyright (C) 2004 Ian Lynagh
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Inflate algorithm implementation
@@ -363,5 +363,3 @@
                (one_tree, lcs_o) = make_tree (i+1) lcs_z
            in (Branch zero_tree one_tree, lcs_o)
  | otherwise = error "make_tree: can't happen"
-
-
diff --git a/src/Data/Either/Utils.hs b/src/Data/Either/Utils.hs
--- a/src/Data/Either/Utils.hs
+++ b/src/Data/Either/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Utilities for working with the Either data type
@@ -77,4 +77,3 @@
 fromEither :: Either a a -> a
 fromEither (Left a)  = a
 fromEither (Right a) = a
-
diff --git a/src/Data/Hash/CRC32/GZip.hs b/src/Data/Hash/CRC32/GZip.hs
--- a/src/Data/Hash/CRC32/GZip.hs
+++ b/src/Data/Hash/CRC32/GZip.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 CRC32 checksumming using the GZIP\/PKZIP algorithm as used in both
diff --git a/src/Data/Hash/MD5.hs b/src/Data/Hash/MD5.hs
--- a/src/Data/Hash/MD5.hs
+++ b/src/Data/Hash/MD5.hs
@@ -8,7 +8,7 @@
    SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-or-later
 
    Maintainer : Ian Lynagh <igloo@earth.li>
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Generation of MD5sums
diff --git a/src/Data/List/Utils.hs b/src/Data/List/Utils.hs
--- a/src/Data/List/Utils.hs
+++ b/src/Data/List/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with lists.
@@ -50,7 +50,8 @@
                     ) where
 import           Control.Monad.State (State, get, put)
 import           Data.List           (concat, elemIndex, elemIndices,
-                                      elemIndices, find, findIndex, intersperse,
+                                      elemIndices, find, findIndex,
+                                      intercalate, intersperse,
                                       isInfixOf, isPrefixOf, isSuffixOf, nub,
                                       tails)
 import           Data.Maybe          (isJust)
@@ -92,7 +93,7 @@
     | otherwise = y : mergeBy cmp allx ys
 
 {- | Returns true if the given list starts with the specified elements;
-false otherwise.  (This is an alias for "Data.List.isPrefixOf".)
+false otherwise.  (This is an alias for 'Data.List.isPrefixOf'.)
 
 Example:
 
@@ -104,7 +105,7 @@
 startswith = isPrefixOf
 
 {- | Returns true if the given list ends with the specified elements;
-false otherwise.  (This is an alias for "Data.List.isSuffixOf".)
+false otherwise.  (This is an alias for 'Data.List.isSuffixOf'.)
 
 Example:
 
@@ -123,7 +124,7 @@
 hasAny _ []          = False             -- An empty list to scan: always false
 hasAny search (x:xs) = if x `elem` search then True else hasAny search xs
 
-{- | Similar to Data.List.takeWhile, takes elements while the func is true.
+{- | Similar to 'Data.List.takeWhile', takes elements while the func is true.
 The function is given the remainder of the list to examine. -}
 takeWhileList :: ([a] -> Bool) -> [a] -> [a]
 takeWhileList _ [] = []
@@ -132,7 +133,7 @@
        then x : takeWhileList func xs
        else []
 
-{- | Similar to Data.List.dropWhile, drops elements while the func is true.
+{- | Similar to 'Data.List.dropWhile', drops elements while the func is true.
 The function is given the remainder of the list to examine. -}
 dropWhileList :: ([a] -> Bool) -> [a] -> [a]
 dropWhileList _ [] = []
@@ -141,7 +142,7 @@
        then dropWhileList func xs
        else list
 
-{- | Similar to Data.List.span, but performs the test on the entire remaining
+{- | Similar to 'Data.List.span', but performs the test on the entire remaining
 list instead of just one element.
 
 @spanList p xs@ is the same as @(takeWhileList p xs, dropWhileList p xs)@
@@ -155,7 +156,7 @@
        else ([],list)
     where (ys,zs) = spanList func xs
 
-{- | Similar to Data.List.break, but performs the test on the entire remaining
+{- | Similar to 'Data.List.break', but performs the test on the entire remaining
 list instead of just one element.
 -}
 breakList :: ([a] -> Bool) -> [a] -> ([a], [a])
@@ -198,14 +199,14 @@
 replace old new l = join new . split old $ l
 
 {- | Given a delimiter and a list of items (or strings), join the items
-by using the delimiter.
+by using the delimiter.  Alias for 'Data.List.intercalate'.
 
 Example:
 
 > join "|" ["foo", "bar", "baz"] -> "foo|bar|baz"
 -}
 join :: [a] -> [[a]] -> [a]
-join delim l = concat (intersperse delim l)
+join = intercalate
 
 {- | Like 'join', but works with a list of anything showable, converting
 it to a String.
@@ -219,18 +220,14 @@
 genericJoin :: Show a => String -> [a] -> String
 genericJoin delim l = join delim (map show l)
 
-{-# DEPRECATED contains "Use Data.List.isInfixOf, will be removed in MissingH 1.1.0" #-}
 {- | Returns true if the given parameter is a sublist of the given list;
-false otherwise.
+false otherwise.  Alias for 'Data.List.isInfixOf'.
 
 Example:
 
 > contains "Haskell" "I really like Haskell." -> True
 > contains "Haskell" "OCaml is great." -> False
 
-This function was submitted to GHC and was applied as
-'Data.List.isInfixOf'.  This function therefore is deprecated and will
-be removed in future versions.
 -}
 
 contains :: Eq a => [a] -> [a] -> Bool
@@ -467,13 +464,10 @@
 
 This function is not compatible with infinite lists.
 
-This is presently an alias for Data.List.nub
+This is presently an alias for 'Data.List.nub'.
  -}
 uniq :: Eq a => [a] -> [a]
 uniq = nub
 
 ----- same as
 --uniq (x:xs) = x : [y | y <- uniq xs, y /= x]
-
-
-
diff --git a/src/Data/MIME/Types.hs b/src/Data/MIME/Types.hs
--- a/src/Data/MIME/Types.hs
+++ b/src/Data/MIME/Types.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Utilities for guessing MIME types of files.
diff --git a/src/Data/Map/Utils.hs b/src/Data/Map/Utils.hs
--- a/src/Data/Map/Utils.hs
+++ b/src/Data/Map/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with Data.Maps.
diff --git a/src/Data/Maybe/Utils.hs b/src/Data/Maybe/Utils.hs
--- a/src/Data/Maybe/Utils.hs
+++ b/src/Data/Maybe/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Utilities for working with the Either data type
diff --git a/src/Data/Progress/Meter.hs b/src/Data/Progress/Meter.hs
--- a/src/Data/Progress/Meter.hs
+++ b/src/Data/Progress/Meter.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2006-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Tool for maintaining a status bar, supporting multiple simultaneous tasks,
@@ -219,5 +219,3 @@
                                             speed <- getSpeed pts
                                             return $ head (rfunc [floor (speed :: Double)]) ++ u ++
                                                        "/s " ++ renderSecs etr
-
-
diff --git a/src/Data/Progress/Tracker.hs b/src/Data/Progress/Tracker.hs
--- a/src/Data/Progress/Tracker.hs
+++ b/src/Data/Progress/Tracker.hs
@@ -12,12 +12,12 @@
    Copyright  : Copyright (C) 2006-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Tools for tracking the status of a long operation.
 
-Written by John Goerzen, jgoerzen\@complete.org 
+Written by John Goerzen, jgoerzen\@complete.org
 
 See also "Data.Progress.Meter" -}
 
@@ -66,7 +66,7 @@
 long-running.  Downloading many large files over the Internet is a common
 example of this.
 
-Any given ProgressTracker can be told about one or more parent trackers.  
+Any given ProgressTracker can be told about one or more parent trackers.
 When the child tracker's status is updated, the parent tracker's status is
 also updated in the same manner.  Therefore, the progress on each individual
 component, as well as the overall progress, can all be kept in sync
@@ -95,7 +95,7 @@
 -- TYPES
 ----------------------------------------------------------------------
 
-{- | A function that, when called, yields the current time. 
+{- | A function that, when called, yields the current time.
 The default is 'defaultTimeSource'. -}
 type ProgressTimeSource = IO Integer
 
@@ -112,7 +112,7 @@
 type ProgressCallback = ProgressStatus -> ProgressStatus -> IO ()
 
 {- | The main progress status record. -}
-data ProgressStatus = 
+data ProgressStatus =
      ProgressStatus {completedUnits :: Integer,
                      totalUnits :: Integer,
                      startTime :: Integer,
@@ -129,7 +129,7 @@
 newtype Progress = Progress (MVar ProgressRecord)
 
 class ProgressStatuses a b where
-    {- | Lets you examine the 'ProgressStatus' that is contained 
+    {- | Lets you examine the 'ProgressStatus' that is contained
        within a 'Progress' object.  You can simply pass
        a 'Progress' object and a function to 'withStatus', and
        'withStatus' will lock the 'Progress' object (blocking any
@@ -184,7 +184,7 @@
                                      timeSource = defaultTimeSource})
                     []
 
-{- | Create a new 'Progress' object initialized with the given status and 
+{- | Create a new 'Progress' object initialized with the given status and
 callbacks.
 No adjustment to the 'startTime' will be made.  If you
 want to use the system clock, you can initialize 'startTime' with
@@ -200,7 +200,7 @@
 {- | Adds an new callback to an existing 'Progress'.  The callback will be
 called whenever the object's status is updated, except by the call to finishP.
 
-Please note that the Progress object will be locked while the callback is 
+Please note that the Progress object will be locked while the callback is
 running, so the callback will not be able to make any modifications to it.
 -}
 addCallback :: Progress -> ProgressCallback -> IO ()
@@ -227,7 +227,7 @@
 called.
 
 This ensures that the total expected counts on the parent are always correct.
-Without doing this, if, say, a transfer ended earlier than expected, ETA 
+Without doing this, if, say, a transfer ended earlier than expected, ETA
 values on the parent would be off since it would be expecting more data than
 actually arrived. -}
 finishP :: Progress -> IO ()
@@ -235,10 +235,10 @@
     modifyMVar_ mp modfunc
     where modfunc :: ProgressRecord -> IO ProgressRecord
           modfunc oldpr =
-              do let adjustment = (completedUnits . status $ oldpr) 
+              do let adjustment = (completedUnits . status $ oldpr)
                                   - (totalUnits . status $ oldpr)
                  callParents oldpr (\x -> incrTotal x adjustment)
-                 return $ oldpr {status = (status oldpr) 
+                 return $ oldpr {status = (status oldpr)
                                  {totalUnits = completedUnits . status $ oldpr}}
 
 ----------------------------------------------------------------------
@@ -246,23 +246,23 @@
 ----------------------------------------------------------------------
 {- | Increment the completed unit count in the 'Progress' object
 by the amount given.  If the value as given exceeds the total, then
-the total will also be raised to match this value so that the 
+the total will also be raised to match this value so that the
 completed count never exceeds the total.
 
 You can decrease the completed unit count by supplying a negative number
 here. -}
 incrP :: Progress -> Integer -> IO ()
 incrP po count = modStatus po statusfunc
-    where statusfunc s = 
+    where statusfunc s =
              s {completedUnits = newcu s,
                 totalUnits = if newcu s > totalUnits s
                                  then newcu s
                                  else totalUnits s}
-          newcu s = completedUnits s + count                  
+          newcu s = completedUnits s + count
 
 {- | Like 'incrP', but never modify the total. -}
 incrP' :: Progress -> Integer -> IO ()
-incrP' po count = 
+incrP' po count =
     modStatus po (\s -> s {completedUnits = completedUnits s + count})
 
 {- | Set the completed unit count in the 'Progress' object to the specified
@@ -283,10 +283,10 @@
 setP' po count = modStatus po (\s -> s {completedUnits = count})
 
 {- | Increment the total unit count in the 'Progress' object by the amount
-given.  This would rarely be needed, but could be needed in some special cases 
+given.  This would rarely be needed, but could be needed in some special cases
 when the total number of units is not known in advance. -}
 incrTotal :: Progress -> Integer -> IO ()
-incrTotal po count = 
+incrTotal po count =
     modStatus po (\s -> s {totalUnits = totalUnits s + count})
 
 {- | Set the total unit count in the 'Progress' object to the specified
@@ -318,14 +318,14 @@
 a number that is valid as any Fractional type, such as a Double, Float, or
 Rational. -}
 getSpeed :: (ProgressStatuses a (IO b), Fractional b) => a -> IO b
-getSpeed po = withStatus po $ \status -> 
+getSpeed po = withStatus po $ \status ->
                 do t <- timeSource status
                    let elapsed = t - (startTime status)
                    return $ if elapsed == 0
                        then fromRational 0
                        else fromRational ((completedUnits status) % elapsed)
 
-{- | Returns the estimated time remaining, in standard time units. 
+{- | Returns the estimated time remaining, in standard time units.
 
 Returns 0 whenever 'getSpeed' would return 0.
 
@@ -333,11 +333,11 @@
 and result. -}
 getETR :: (ProgressStatuses a (IO Integer),
            ProgressStatuses a (IO Rational)) => a -> IO Integer
-getETR po = 
+getETR po =
     do speed <- ((getSpeed po)::IO Rational)
        if speed == 0
           then return 0
-          else 
+          else
               -- FIXME: potential for a race condition here, but it should
               -- be negligible
               withStatus po $ \status ->
@@ -376,7 +376,7 @@
 modStatus (Progress mp) func =
     modifyMVar_ mp modfunc
     where modfunc :: ProgressRecord -> IO ProgressRecord
-          modfunc oldpr = 
+          modfunc oldpr =
               do let newpr = oldpr {status = func (status oldpr)}
                  mapM_ (\x -> x (status oldpr) (status newpr))
                            (callbacks oldpr)
@@ -394,4 +394,3 @@
 
 callParents :: ProgressRecord -> (Progress -> IO ()) -> IO ()
 callParents pr func = mapM_ func (parents pr)
-
diff --git a/src/Data/Quantity.hs b/src/Data/Quantity.hs
--- a/src/Data/Quantity.hs
+++ b/src/Data/Quantity.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2006-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Tools for rendering sizes
diff --git a/src/Data/String/Utils.hs b/src/Data/String/Utils.hs
--- a/src/Data/String/Utils.hs
+++ b/src/Data/String/Utils.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with strings.
diff --git a/src/Data/Tuple/Utils.hs b/src/Data/Tuple/Utils.hs
--- a/src/Data/Tuple/Utils.hs
+++ b/src/Data/Tuple/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with tuples.
diff --git a/src/Network/Email/Mailbox.hs b/src/Network/Email/Mailbox.hs
--- a/src/Network/Email/Mailbox.hs
+++ b/src/Network/Email/Mailbox.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 General support for e-mail mailboxes
@@ -26,7 +26,7 @@
 where
 
 {- | The flags which may be assigned to a message. -}
-data Flag = 
+data Flag =
            SEEN
            | ANSWERED
            | FLAGGED
@@ -35,14 +35,14 @@
            | FORWARDED
            | OTHERFLAG String
            deriving (Eq, Show)
-           
+
 {- | Convenience shortcut -}
 type Flags = [Flag]
 
 {- | A Message is represented as a simple String. -}
 type Message = String
 
-{- | Main class for readable mailboxes. 
+{- | Main class for readable mailboxes.
 
 The mailbox object /a/ represents zero or more 'Message's.  Each message
 has a unique identifier /b/ in a format specific to each given mailbox.
@@ -65,12 +65,12 @@
     getMessages :: a -> [b] -> IO [(b, Flags, Message)]
 
     listIDs mb = listMessageFlags mb >>= return . map fst
-    listMessageFlags mb = getAll mb >>= return . 
+    listMessageFlags mb = getAll mb >>= return .
                            map (\(i, f, _) -> (i, f))
     getMessages mb list =
         do messages <- getAll mb
            return $ filter (\(id, f, m) -> id `elem` list) messages
-    
+
 class (MailboxReader a b) => MailboxWriter a b where
     appendMessages :: a -> [(Flags, Message)] -> IO [b]
     deleteMessages :: a -> [b] -> IO ()
diff --git a/src/Network/Email/Sendmail.hs b/src/Network/Email/Sendmail.hs
--- a/src/Network/Email/Sendmail.hs
+++ b/src/Network/Email/Sendmail.hs
@@ -14,7 +14,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This Haskell module provides an interface to transmitting a mail message.
@@ -101,4 +101,3 @@
                       return $! r
 
 #endif
-
diff --git a/src/Network/Utils.hs b/src/Network/Utils.hs
--- a/src/Network/Utils.hs
+++ b/src/Network/Utils.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: systems with networking
 
 This module provides various helpful utilities for dealing with networking
diff --git a/src/System/Cmd/Utils.hs b/src/System/Cmd/Utils.hs
--- a/src/System/Cmd/Utils.hs
+++ b/src/System/Cmd/Utils.hs
@@ -15,7 +15,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable to platforms with POSIX process\/signal tools
 
 Command invocation utilities.
diff --git a/src/System/Console/GetOpt/Utils.hs b/src/System/Console/GetOpt/Utils.hs
--- a/src/System/Console/GetOpt/Utils.hs
+++ b/src/System/Console/GetOpt/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Written by John Goerzen, jgoerzen\@complete.org
diff --git a/src/System/Daemon.hs b/src/System/Daemon.hs
--- a/src/System/Daemon.hs
+++ b/src/System/Daemon.hs
@@ -14,7 +14,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable to platforms with POSIX process\/signal tools
 
 Tools for writing daemons\/server processes
diff --git a/src/System/Debian.hs b/src/System/Debian.hs
--- a/src/System/Debian.hs
+++ b/src/System/Debian.hs
@@ -11,7 +11,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with Debian
diff --git a/src/System/Debian/ControlParser.hs b/src/System/Debian/ControlParser.hs
--- a/src/System/Debian/ControlParser.hs
+++ b/src/System/Debian/ControlParser.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with Debian
diff --git a/src/System/FileArchive/GZip.hs b/src/System/FileArchive/GZip.hs
--- a/src/System/FileArchive/GZip.hs
+++ b/src/System/FileArchive/GZip.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 GZip file decompression
diff --git a/src/System/IO/Binary.hs b/src/System/IO/Binary.hs
--- a/src/System/IO/Binary.hs
+++ b/src/System/IO/Binary.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable to platforms supporting binary I\/O
 
 This module provides various helpful utilities for dealing with binary
diff --git a/src/System/IO/HVFS.hs b/src/System/IO/HVFS.hs
--- a/src/System/IO/HVFS.hs
+++ b/src/System/IO/HVFS.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Haskell Virtual FS -- generic support for real or virtual filesystem in Haskell
diff --git a/src/System/IO/HVFS/Combinators.hs b/src/System/IO/HVFS/Combinators.hs
--- a/src/System/IO/HVFS/Combinators.hs
+++ b/src/System/IO/HVFS/Combinators.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Support for combining different HVFS modules together
diff --git a/src/System/IO/HVFS/InstanceHelpers.hs b/src/System/IO/HVFS/InstanceHelpers.hs
--- a/src/System/IO/HVFS/InstanceHelpers.hs
+++ b/src/System/IO/HVFS/InstanceHelpers.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Utilities for creating instances of the items defined in
@@ -210,4 +210,3 @@
     vOpen x fp _ = vRaiseError x permissionErrorType
                      "Only ReadMode is supported with MemoryVFS files"
                      (Just fp)
-
diff --git a/src/System/IO/HVFS/Utils.hs b/src/System/IO/HVFS/Utils.hs
--- a/src/System/IO/HVFS/Utils.hs
+++ b/src/System/IO/HVFS/Utils.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing
@@ -145,5 +145,3 @@
                             ) c
               linedata <- mapM (showentry fp fs) pairs
               return $ unlines $ ["total 1"] ++ linedata
-
-
diff --git a/src/System/IO/HVIO.hs b/src/System/IO/HVIO.hs
--- a/src/System/IO/HVIO.hs
+++ b/src/System/IO/HVIO.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Haskell Virtual I\/O -- a system to increase the flexibility of input and
diff --git a/src/System/IO/PlafCompat.hs b/src/System/IO/PlafCompat.hs
--- a/src/System/IO/PlafCompat.hs
+++ b/src/System/IO/PlafCompat.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 On Unix, exports System.Posix.Types and System.Posix.Files.
diff --git a/src/System/IO/StatCompat.hs b/src/System/IO/StatCompat.hs
--- a/src/System/IO/StatCompat.hs
+++ b/src/System/IO/StatCompat.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Provide a stat-like structure for use in MissingH.  Especially
diff --git a/src/System/IO/Utils.hs b/src/System/IO/Utils.hs
--- a/src/System/IO/Utils.hs
+++ b/src/System/IO/Utils.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 -}
 
diff --git a/src/System/IO/WindowsCompat.hs b/src/System/IO/WindowsCompat.hs
--- a/src/System/IO/WindowsCompat.hs
+++ b/src/System/IO/WindowsCompat.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Provides some types and related items on Windows to be compatible with
diff --git a/src/System/Path.hs b/src/System/Path.hs
--- a/src/System/Path.hs
+++ b/src/System/Path.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various helpful utilities for dealing with path and
diff --git a/src/System/Path/Glob.hs b/src/System/Path/Glob.hs
--- a/src/System/Path/Glob.hs
+++ b/src/System/Path/Glob.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2006-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Functions for expanding wildcards, filenames, and pathnames.
diff --git a/src/System/Path/NameManip.hs b/src/System/Path/NameManip.hs
--- a/src/System/Path/NameManip.hs
+++ b/src/System/Path/NameManip.hs
@@ -4,7 +4,7 @@
    Copyright  : Copyright (C) 2004 Volker Wysk
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Low-level path name manipulations.
diff --git a/src/System/Path/WildMatch.hs b/src/System/Path/WildMatch.hs
--- a/src/System/Path/WildMatch.hs
+++ b/src/System/Path/WildMatch.hs
@@ -13,7 +13,7 @@
    Copyright  : Copyright (C) 2006-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Matching filenames with wildcards.  See also "System.Path.Glob" for
diff --git a/src/System/Posix/Consts.hs b/src/System/Posix/Consts.hs
--- a/src/System/Posix/Consts.hs
+++ b/src/System/Posix/Consts.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2005-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Exports some POSIX constants and functions that are not exported in fptools
@@ -46,5 +46,3 @@
 
 symbolicLinkMode :: FileMode
 symbolicLinkMode = 0o0120000
-
-
diff --git a/src/System/Time/Utils.hs b/src/System/Time/Utils.hs
--- a/src/System/Time/Utils.hs
+++ b/src/System/Time/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 This module provides various Haskell utilities for dealing with times and
@@ -131,4 +131,3 @@
           zippedlist = zip quantlist suffixlist
           -- Drop all leading elements that are 0, then take at most 2
           workinglist = take 2 . dropWhile (\(q, _) -> q == 0) $ zippedlist
-
diff --git a/src/Text/ParserCombinators/Parsec/Utils.hs b/src/Text/ParserCombinators/Parsec/Utils.hs
--- a/src/Text/ParserCombinators/Parsec/Utils.hs
+++ b/src/Text/ParserCombinators/Parsec/Utils.hs
@@ -12,7 +12,7 @@
    Copyright  : Copyright (C) 2004-2011 John Goerzen
    SPDX-License-Identifier: BSD-3-Clause
 
-   Stability  : provisional
+   Stability  : stable
    Portability: portable
 
 Written by John Goerzen, jgoerzen\@complete.org
@@ -98,4 +98,3 @@
                              Just _  -> unexpected errormsg
         in
         try workerFunc
-
diff --git a/testsrc/Eithertest.hs b/testsrc/Eithertest.hs
--- a/testsrc/Eithertest.hs
+++ b/testsrc/Eithertest.hs
@@ -6,10 +6,14 @@
 For license and copyright information, see the file LICENSE
 
 -}
+{-# LANGUAGE CPP #-}
 
 module Eithertest(tests) where
+
 import           Control.Exception
+#if !MIN_VERSION_base(4,7,0)
 import           Control.Exception.ErrorCall.EqInstance
+#endif
 import           Data.Either.Utils
 import           Test.HUnit
 import           TestUtils
@@ -37,4 +41,3 @@
 tests = TestList [TestLabel "test_maybeToEither" (TestList test_maybeToEither),
                   TestLabel "test_forceEither" (TestList test_forceEither)
                  ]
-
