diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,14 @@
 # Version History
 
+## 0.4.0.0 (March 17, 2020)
+
+  - The `askUntil` function is now polymorphic in its return type.
+    This allows the confirmation function to change the return type.
+
+  - Removed `Data.Monoid` backwards compatibility for older GHCs.
+
+  - Update dependency bounds
+
 ## 0.3.2.1 (April 15, 2019)
 
   - Update dependency bounds
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015-2019 Peter J. Jones <pjones@devalot.com>
+Copyright (c) 2015-2020 Peter J. Jones <pjones@devalot.com>
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
 # Byline
 
-[![Build Status](https://travis-ci.org/pjones/byline.svg?branch=master)](https://travis-ci.org/pjones/byline)
-
 Byline simplifies writing interactive terminal applications by
 building upon [ansi-terminal][] and [haskeline][]. This makes it
 possible to print messages and prompts that include terminal escape
diff --git a/byline.cabal b/byline.cabal
--- a/byline.cabal
+++ b/byline.cabal
@@ -1,18 +1,19 @@
+cabal-version: 2.2
+
 --------------------------------------------------------------------------------
 name:          byline
-version:       0.3.2.1
+version:       0.4.0.0
 synopsis:      Library for creating command-line interfaces (colors, menus, etc.)
-homepage:      https://code.devalot.com/open/byline
-bug-reports:   https://code.devalot.com/open/byline/issues
-license:       BSD2
+homepage:      https://github.com/pjones/byline
+bug-reports:   https://github.com/pjones/byline/issues
+license:       BSD-2-Clause
 license-file:  LICENSE
 author:        Peter Jones <pjones@devalot.com>
 maintainer:    Peter Jones <pjones@devalot.com>
-copyright:     Copyright: (c) 2015-2019 Peter J. Jones
+copyright:     Copyright: (c) 2015-2020 Peter J. Jones
 category:      System, User Interfaces
 build-type:    Simple
-stability:     experimental
-cabal-version: 1.18
+stability:     stable
 description:
   Byline simplifies writing interactive terminal applications by
   building upon @ansi-terminal@ and @haskeline@.  This makes it
@@ -34,7 +35,7 @@
 --------------------------------------------------------------------------------
 source-repository head
   type: git
-  location: https://code.devalot.com/open/byline.git
+  location: https://github.com/pjones/byline.git
 
 --------------------------------------------------------------------------------
 flag build-examples
@@ -43,7 +44,34 @@
   default: False
 
 --------------------------------------------------------------------------------
+common options
+  default-language: Haskell2010
+  ghc-options: -Wall
+               -Werror=incomplete-record-updates
+               -Werror=incomplete-uni-patterns
+               -Werror=missing-home-modules
+               -Widentities
+               -Wmissing-export-lists
+               -Wredundant-constraints
+
+--------------------------------------------------------------------------------
+common dependencies
+  build-depends: base          >= 4.9  && < 5.0
+               , ansi-terminal >= 0.6  && < 0.12
+               , colour        >= 2.3  && < 2.4
+               , containers    >= 0.5  && < 0.7
+               , exceptions    >= 0.8  && < 0.11
+               , haskeline     >= 0.7  && < 0.8
+               , mtl           >= 2.1  && < 2.3
+               , terminfo-hs   >= 0.1  && < 0.3
+               , text          >= 0.11 && < 1.3
+               , transformers  >= 0.3  && < 0.6
+
+--------------------------------------------------------------------------------
 library
+  import: options, dependencies
+  hs-source-dirs: src
+
   exposed-modules:
     System.Console.Byline
     System.Console.Byline.Color
@@ -58,40 +86,20 @@
     System.Console.Byline.Primitive
     System.Console.Byline.Stylized
 
-  hs-source-dirs: src
-  default-language: Haskell2010
-  ghc-options: -Wall -fwarn-incomplete-uni-patterns
-
-  build-depends: base          >= 4.7  && < 5.0
-               , ansi-terminal >= 0.6  && < 0.10
-               , colour        >= 2.3  && < 2.4
-               , containers    >= 0.5  && < 0.7
-               , exceptions    >= 0.8  && < 0.11
-               , haskeline     >= 0.7  && < 0.8
-               , mtl           >= 2.1  && < 2.3
-               , terminfo-hs   >= 0.1  && < 0.3
-               , text          >= 0.11 && < 1.3
-               , transformers  >= 0.3  && < 0.6
-
-  if !impl(ghc >= 8.0)
-    build-depends: semigroups == 0.18.*
-
 --------------------------------------------------------------------------------
 executable simple
+  import: options, dependencies
   main-is: examples/simple.hs
-  default-language: Haskell2010
-  ghc-options: -Wall -fwarn-incomplete-uni-patterns
-  build-depends: base, byline, text
+  build-depends: byline
 
   if !flag(build-examples)
     buildable: False
 
 --------------------------------------------------------------------------------
 executable menu
+  import: options, dependencies
   main-is: examples/menu.hs
-  default-language: Haskell2010
-  ghc-options: -Wall -fwarn-incomplete-uni-patterns
-  build-depends: base, byline, text
+  build-depends: byline
 
   if !flag(build-examples)
     buildable: False
diff --git a/src/System/Console/Byline.hs b/src/System/Console/Byline.hs
--- a/src/System/Console/Byline.hs
+++ b/src/System/Console/Byline.hs
@@ -110,9 +110,6 @@
        ) where
 
 --------------------------------------------------------------------------------
-import Data.Monoid ((<>))
-
---------------------------------------------------------------------------------
 import System.Console.Byline.Color
 import System.Console.Byline.Completion
 import System.Console.Byline.Internal.Byline
diff --git a/src/System/Console/Byline/Internal/Types.hs b/src/System/Console/Byline/Internal/Types.hs
--- a/src/System/Console/Byline/Internal/Types.hs
+++ b/src/System/Console/Byline/Internal/Types.hs
@@ -21,7 +21,6 @@
 
 --------------------------------------------------------------------------------
 -- Library imports:
-import Data.Monoid
 import qualified Data.Semigroup as Semi
 
 --------------------------------------------------------------------------------
diff --git a/src/System/Console/Byline/Menu.hs b/src/System/Console/Byline/Menu.hs
--- a/src/System/Console/Byline/Menu.hs
+++ b/src/System/Console/Byline/Menu.hs
@@ -36,7 +36,6 @@
 import Data.Map (Map)
 import qualified Data.Map as Map
 import Data.Maybe
-import Data.Monoid
 import Data.Text (Text)
 import qualified Data.Text as Text
 import Text.Printf (printf)
diff --git a/src/System/Console/Byline/Primitive.hs b/src/System/Console/Byline/Primitive.hs
--- a/src/System/Console/Byline/Primitive.hs
+++ b/src/System/Console/Byline/Primitive.hs
@@ -32,7 +32,6 @@
 import qualified Control.Monad.Reader as Reader
 import Data.IORef
 import Data.Maybe
-import Data.Monoid
 import Data.Text (Text)
 import qualified Data.Text as T
 import qualified System.Console.Haskeline as H
@@ -127,8 +126,8 @@
 askUntil :: (MonadIO m)
          => Stylized                           -- ^ The prompt.
          -> Maybe Text                         -- ^ Optional default answer.
-         -> (Text -> m (Either Stylized Text)) -- ^ Confirmation function.
-         -> Byline m Text
+         -> (Text -> m (Either Stylized a))    -- ^ Confirmation function.
+         -> Byline m a
 askUntil prompt defans confirm = go where
   go = do
     answer <- ask prompt defans
diff --git a/src/System/Console/Byline/Stylized.hs b/src/System/Console/Byline/Stylized.hs
--- a/src/System/Console/Byline/Stylized.hs
+++ b/src/System/Console/Byline/Stylized.hs
@@ -21,7 +21,6 @@
 
 --------------------------------------------------------------------------------
 -- Library imports:
-import Data.Monoid
 import qualified Data.Semigroup as Semi
 import Data.String
 import Data.Text (Text)
