diff --git a/api-builder.cabal b/api-builder.cabal
--- a/api-builder.cabal
+++ b/api-builder.cabal
@@ -1,11 +1,5 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
---
--- see: https://github.com/sol/hpack
---
--- hash: 7c4b7181e34f5c26900835396c9c93f9249c246a35bacfea6a01f9a84dff464b
-
 name:           api-builder
-version:        0.15.0.0
+version:        0.16.0.0
 synopsis:       Library for easily building REST API wrappers in Haskell
 category:       Network
 homepage:       https://github.com/intolerable/api-builder
@@ -22,22 +16,23 @@
   location: git://github.com/intolerable/api-builder.git
 
 library
-  hs-source-dirs:
-      src
-  default-extensions: OverloadedStrings FlexibleInstances
+  hs-source-dirs: src/
+  default-extensions:
+    OverloadedStrings
+    FlexibleInstances
   ghc-options: -Wall
   build-depends:
-      HTTP ==4000.*
-    , aeson >=0.9 && <1.3
-    , base >=4.6 && <4.12
-    , bifunctors >=4.0 && <6.0
-    , bytestring ==0.10.*
-    , http-client >=0.4.30 && <0.6
-    , http-client-tls >=0.2 && <0.4
-    , http-types >=0.8 && <0.13
-    , text ==1.*
-    , tls >=1.3 && <1.5
-    , transformers >=0.4 && <0.6
+    HTTP ==4000.*,
+    aeson >=0.9 && <1.5,
+    base >=4.6 && <4.14,
+    bifunctors >=4.0 &&< 6.0,
+    bytestring ==0.10.*,
+    http-client >=0.4.30 && <0.7,
+    http-client-tls >=0.2 && <0.4,
+    http-types >=0.8 && <0.13,
+    text ==1.*,
+    tls >=1.3 && <1.5,
+    transformers >=0.4 && <0.6
   exposed-modules:
       Network.API.Builder
       Network.API.Builder.API
@@ -56,33 +51,32 @@
 test-suite test
   type: exitcode-stdio-1.0
   main-is: Spec.hs
-  hs-source-dirs:
-      test
+  hs-source-dirs: test/
   default-extensions: OverloadedStrings FlexibleInstances ScopedTypeVariables
   ghc-options: -Wall
   build-depends:
-      Cabal >=1.16.0
-    , aeson
-    , api-builder
-    , base ==4.*
-    , bytestring
-    , hspec
-    , http-client
-    , text
-    , transformers
+    Cabal >=1.16.0,
+    aeson,
+    api-builder,
+    base ==4.*,
+    bytestring,
+    hspec,
+    http-client,
+    QuickCheck,
+    text,
+    transformers
   other-modules:
-      Network.API.Builder.ErrorSpec
-      Network.API.Builder.QuerySpec
-      Network.API.Builder.RoutesSpec
-      Network.API.Builder.SendSpec
-      Paths_api_builder
+    Network.API.Builder.ErrorSpec
+    Network.API.Builder.QuerySpec
+    Network.API.Builder.RoutesSpec
+    Network.API.Builder.SendSpec
+    Paths_api_builder
   default-language: Haskell2010
 
 test-suite test-io
   type: exitcode-stdio-1.0
   main-is: Spec.hs
-  hs-source-dirs:
-      test-io
+  hs-source-dirs: test-io/
   default-extensions: OverloadedStrings FlexibleInstances LambdaCase
   ghc-options: -Wall
   build-depends:
@@ -96,6 +90,6 @@
     , text
     , transformers
   other-modules:
-      Network.API.Builder.Examples.StackOverflowSpec
-      Paths_api_builder
+    Network.API.Builder.Examples.StackOverflowSpec
+    Paths_api_builder
   default-language: Haskell2010
diff --git a/src/Network/API/Builder/Error.hs b/src/Network/API/Builder/Error.hs
--- a/src/Network/API/Builder/Error.hs
+++ b/src/Network/API/Builder/Error.hs
@@ -1,7 +1,7 @@
 module Network.API.Builder.Error
   ( APIError(..) ) where
 
-import Data.Monoid
+import Data.Semigroup
 import Network.HTTP.Client (HttpException)
 import Prelude
 
@@ -23,9 +23,13 @@
   (APIError a) == (APIError b) = a == b
   InvalidURLError == InvalidURLError = True
   (ParseError a) == (ParseError b) = a == b
+  EmptyError == EmptyError = True
   _ == _ = False
 
+instance Semigroup (APIError a) where
+  EmptyError <> x = x
+  x <> _ = x
+
 instance Monoid (APIError a) where
   mempty = EmptyError
-  EmptyError `mappend` x = x
-  x `mappend` _ = x
+  mappend = (<>)
diff --git a/test/Network/API/Builder/ErrorSpec.hs b/test/Network/API/Builder/ErrorSpec.hs
--- a/test/Network/API/Builder/ErrorSpec.hs
+++ b/test/Network/API/Builder/ErrorSpec.hs
@@ -1,13 +1,24 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 module Network.API.Builder.ErrorSpec where
 
+import Data.Semigroup ((<>))
 import Network.API.Builder.Error
 
 import Test.Hspec
 import Test.Hspec.QuickCheck
+import Test.QuickCheck
 
 main :: IO ()
 main = hspec spec
 
+instance Arbitrary a => Arbitrary (APIError a) where
+  arbitrary = oneof
+    [ APIError <$> arbitrary
+    , pure InvalidURLError
+    , ParseError <$> arbitrary
+    , pure EmptyError
+    ]
+
 spec :: Spec
 spec =
   describe "APIError" $ do
@@ -23,3 +34,7 @@
 
       prop "APIError x == APIError x" $ \(x :: String) ->
         APIError x == APIError x
+
+    describe "Semigroup" $ do
+      prop "(x <> y) <> z == x <> (y <> z)" $ \(x :: APIError ()) y z ->
+        (x <> y) <> z == x <> (y <> z)
