diff --git a/Changes.md b/Changes.md
--- a/Changes.md
+++ b/Changes.md
@@ -1,3 +1,6 @@
+* 0.9.4
+  - Bump upper bounds on bytestring-trie
+  - Support GHC 8.4 and 8.6
 * 0.9.3
   - Bump upper bound on http-types due to stackage.
 * 0.9.0
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,11 +4,16 @@
 
 [![Build Status](https://travis-ci.org/helium/airship.svg?branch=master)](https://travis-ci.org/helium/airship)
 
-Airship is a Haskell library for handling and serving HTTP requests in a RESTful fashion. It is heavily inspired by [Webmachine](https://github.com/basho/webmachine) and works with any [WAI](https://hackage.haskell.org/package/wai)-compatible web server such as [Warp](https://hackage.haskell.org/package/warp). It aims to be small, fast, and flexible.
+Airship is a Haskell library for handling and serving HTTP requests in a RESTful fashion. It is heavily inspired by [Webmachine](https://github.com/basho/webmachine)
+and works with any [WAI](https://hackage.haskell.org/package/wai)-compatible web server such as [Warp](https://hackage.haskell.org/package/warp).
 
+It aims to be small, fast, and flexible.
+
 # How does it work?
 
-Airship resources are represented with a [`Resource` record type](https://github.com/helium/airship/blob/master/src/Airship/Resource.hs#L39-L117). Each field in `Resource` corresponds to an action taken in the [Webmachine decision tree](https://raw.githubusercontent.com/wiki/Webmachine/webmachine/images/http-headers-status-v3.png). Airship provides a `defaultResource` with sensible defaults for each of these actions; you build web services by overriding fields in the default resource with your own.
+Airship resources are represented with a [`Resource` record type](https://github.com/helium/airship/blob/master/airship/src/Airship/Resource.hs#L39-L117).
+Each field in `Resource` corresponds to an action taken in the [Webmachine decision tree](https://raw.githubusercontent.com/wiki/Webmachine/webmachine/images/http-headers-status-v3.png).
+Airship provides a `defaultResource` with sensible defaults for each of these actions; you build web services by overriding fields in the default resource with your own.
 
 Routes are declared with a simple monadic syntax:
 
@@ -18,6 +23,7 @@
     "account" </> var "name"    #> accountResource
 ```
 
-For a simple example that handles HTTP GET and POST requests, please check [`example/Basic.hs`](https://github.com/helium/airship/blob/master/example/Basic.hs). For a slightly more involved example that generates HTML and manages a pool of resources, please check the [blimp](https://github.com/patrickt/blimp) repository.
+For a simple example that handles HTTP GET and POST requests, please check [`example/Basic.hs`](https://github.com/helium/airship/blob/master/example/Basic.hs).
+For a slightly more involved example that generates HTML and manages a pool of resources, please check the [blimp](https://github.com/patrickt/blimp) repository.
 
 Airship is copyright &copy; 2015 Helium Systems, Inc., and released to the public under the terms of the MIT license.
diff --git a/airship.cabal b/airship.cabal
--- a/airship.cabal
+++ b/airship.cabal
@@ -2,17 +2,18 @@
 synopsis:             A Webmachine-inspired HTTP library
 homepage:             https://github.com/helium/airship/
 Bug-reports:          https://github.com/helium/airship/issues
-version:              0.9.3
+version:              0.9.4
 license:              MIT
 license-file:         LICENSE
 author:               Reid Draper and Patrick Thomson
-maintainer:           Tim McGilchrist <timmcgil@gmail.com>, reid@helium.com
+maintainer:           Tim McGilchrist <timmcgil@gmail.com>
 category:             Web
 build-type:           Simple
 cabal-version:        >=1.10
 description:          A Webmachine-inspired HTTP library based off ideas from the original Erlang project <https://github.com/webmachine/webmachine>
                       .
                       A number of examples can be found in <https://github.com/helium/airship/tree/master/example> illustrating how to build airship based services.
+tested-with:          GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.3, GHC == 8.6.3
 extra-source-files:
   README.md
   Changes.md
@@ -46,7 +47,7 @@
                       , base64-bytestring       == 1.0.*
                       , blaze-builder           >= 0.3     && < 0.5
                       , bytestring
-                      , bytestring-trie         == 0.2.4.*
+                      , bytestring-trie         >= 0.2.4   && < 0.2.6
                       , case-insensitive
                       , containers
                       , cryptohash              == 0.11.*
@@ -65,14 +66,16 @@
                       , network
                       , old-locale
                       , random
+                      , semigroups              == 0.18.*
                       , text
                       , time
                       , transformers
                       , transformers-base
                       , unix                    == 2.7.*
                       , unordered-containers
-                      , wai                     >= 3.0     && < 3.3
-                      , wai-extra               == 3.0.*
+                      , wai                     >= 3.0.3.0 && < 3.2.2
+                      -- https://github.com/yesodweb/wai/pull/726
+                      , wai-extra               >= 3.0     && < 3.0.26
 
 test-suite unit
   default-language:   Haskell2010
@@ -83,9 +86,9 @@
                       , airship
                       , text                    == 1.2.*
                       , bytestring              >= 0.9.1   && < 0.11
-                      , tasty                   >= 0.10.1  && < 0.12
-                      , tasty-quickcheck        >= 0.8.3   && < 0.10
-                      , tasty-hunit             >= 0.9.1   && < 0.10
+                      , tasty                   >= 0.10.1  && < 1.3
+                      , tasty-quickcheck        >= 0.8.3   && < 0.11
+                      , tasty-hunit             >= 0.9.1   && < 0.11
                       , transformers
                       , wai                     >= 3.0     && < 3.3
 
diff --git a/src/Airship/Internal/Helpers.hs b/src/Airship/Internal/Helpers.hs
--- a/src/Airship/Internal/Helpers.hs
+++ b/src/Airship/Internal/Helpers.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes        #-}
 {-# LANGUAGE RecordWildCards   #-}
-
+{-# LANGUAGE MonoLocalBinds    #-}
 module Airship.Internal.Helpers
     ( parseFormData
     , contentTypeMatches
@@ -121,7 +121,7 @@
 -- | Like 'resourceToWaiT', but expects the 'RoutingSpec' to have been
 -- evaluated with 'runRouter'. This is more efficient than 'resourceToWaiT', as
 -- the routes will not be evaluated on every request.
--- 
+--
 -- Given @routes :: RoutingSpec IO ()@, 'resourceToWaiT'' can be invoked like so:
 --
 -- > resourceToWaiT' cfg (const id) (runRouter routes) errors
diff --git a/src/Airship/Internal/Route.hs b/src/Airship/Internal/Route.hs
--- a/src/Airship/Internal/Route.hs
+++ b/src/Airship/Internal/Route.hs
@@ -31,7 +31,8 @@
 import           Data.HashMap.Strict        (HashMap, fromList)
 import qualified Data.List                  as L (foldl')
 import           Data.Maybe                 (isNothing)
-import           Data.Monoid
+import           Data.Semigroup             (Semigroup, (<>))
+import           Data.Monoid                (Monoid)
 import           Data.Text                  (Text)
 import qualified Data.Text                  as T (intercalate, cons)
 import           Data.Text.Encoding         (encodeUtf8, decodeUtf8)
@@ -49,7 +50,7 @@
 -- | 'Route's represent chunks of text used to match over URLs.
 -- You match hardcoded paths with string literals (and the @-XOverloadedStrings@ extension),
 -- named variables with the 'var' combinator, and wildcards with 'star'.
-newtype Route = Route { getRoute :: [BoundOrUnbound] } deriving (Show, Monoid)
+newtype Route = Route { getRoute :: [BoundOrUnbound] } deriving (Show, Semigroup, Monoid)
 
 routeText :: Route -> Text
 routeText (Route parts) =
diff --git a/src/Airship/Types.hs b/src/Airship/Types.hs
--- a/src/Airship/Types.hs
+++ b/src/Airship/Types.hs
@@ -72,7 +72,6 @@
                                                       defaultRequest)
 import qualified Network.Wai                         as Wai
 
-
 -- | Reads the entirety of the request body in a single string.
 -- This turns the chunks obtained from repeated invocations of 'requestBody' into a lazy 'ByteString'.
 entireRequestBody :: MonadIO m => Request -> m LB.ByteString
diff --git a/test/unit/test.hs b/test/unit/test.hs
--- a/test/unit/test.hs
+++ b/test/unit/test.hs
@@ -1,9 +1,8 @@
 {-# LANGUAGE OverloadedStrings #-}
-
 module Main where
 
-import Airship
-import Control.Concurrent
+import Airship (requestBody, entireRequestBody, defaultRequest)
+import Control.Concurrent (newMVar, modifyMVar)
 import Data.ByteString (ByteString)
 
 import Test.Tasty
