diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,3 @@
+# 1.0.1
+
+* support GHC 9.0
diff --git a/serversession-frontend-wai.cabal b/serversession-frontend-wai.cabal
--- a/serversession-frontend-wai.cabal
+++ b/serversession-frontend-wai.cabal
@@ -1,19 +1,25 @@
+cabal-version:   >= 1.10
 name:            serversession-frontend-wai
-version:         1.0
+version:         1.0.1
 license:         MIT
 license-file:    LICENSE
 author:          Felipe Lessa <felipe.lessa@gmail.com>
-maintainer:      Felipe Lessa <felipe.lessa@gmail.com>
+maintainer:      Michael Xavier <michael@michaelxavier.net>
 synopsis:        wai-session bindings for serversession.
 category:        Web
 stability:       Stable
-cabal-version:   >= 1.8
 build-type:      Simple
 homepage:        https://github.com/yesodweb/serversession
 description:     API docs and the README are available at <http://www.stackage.org/package/serversession-frontend-wai>
 extra-source-files: README.md
+                    changelog.md
 
+flag lib-Werror
+  default: False
+  manual: True
+
 library
+  default-language: Haskell2010
   hs-source-dirs: src
   build-depends:
       base                      >= 4.6   && < 5
@@ -33,11 +39,15 @@
   exposed-modules:
     Web.ServerSession.Frontend.Wai
     Web.ServerSession.Frontend.Wai.Internal
-  extensions:
+  default-extensions:
     FlexibleContexts
     OverloadedStrings
     TypeFamilies
   ghc-options:     -Wall
+  if flag(lib-Werror)
+    ghc-options: -Werror
+  if impl(ghc >= 8.0.0)
+    ghc-options: -Wno-redundant-constraints
 
 source-repository head
   type:     git
diff --git a/src/Web/ServerSession/Frontend/Wai.hs b/src/Web/ServerSession/Frontend/Wai.hs
--- a/src/Web/ServerSession/Frontend/Wai.hs
+++ b/src/Web/ServerSession/Frontend/Wai.hs
@@ -6,7 +6,7 @@
 --   @Max-age@ field is not supported by all browsers: some
 --   browsers will treat them as non-persistent cookies.
 --
---   * Also, the @Max-age@ is fixed and does not take a given a
+--   * Also, the @Max-age@ is fixed and does not take a given
 --   session into consideration.
 module Web.ServerSession.Frontend.Wai
   ( -- * Simple interface
diff --git a/src/Web/ServerSession/Frontend/Wai/Internal.hs b/src/Web/ServerSession/Frontend/Wai/Internal.hs
--- a/src/Web/ServerSession/Frontend/Wai/Internal.hs
+++ b/src/Web/ServerSession/Frontend/Wai/Internal.hs
@@ -10,11 +10,12 @@
   , forceInvalidate
   ) where
 
-import Control.Applicative ((<$>))
+import Control.Applicative as A
 import Control.Monad (guard)
 import Control.Monad.IO.Class (MonadIO(..))
 import Data.ByteString (ByteString)
 import Data.Default (def)
+import Data.Kind (Type)
 import Data.Text (Text)
 import Web.PathPieces (toPathPiece)
 import Web.ServerSession.Core
@@ -80,7 +81,7 @@
   -- We need to use atomicModifyIORef instead of readIORef
   -- because latter may be reordered (cf. "Memory Model" on
   -- Data.IORef's documentation).
-  ( \k   -> kvLookup k <$> liftIO (I.atomicModifyIORef' sessionRef $ \a -> (a, a))
+  ( \k   -> kvLookup k A.<$> liftIO (I.atomicModifyIORef' sessionRef $ \a -> (a, a))
   , \k v -> liftIO (I.atomicModifyIORef' sessionRef $ flip (,) () . kvInsert k v)
   )
 
@@ -91,8 +92,8 @@
 -- | Class for session data types that can be used as key-value
 -- stores.
 class IsSessionData sess => KeyValue sess where
-  type Key   sess :: *
-  type Value sess :: *
+  type Key   sess :: Type
+  type Value sess :: Type
   kvLookup :: Key sess -> sess -> Maybe (Value sess)
   kvInsert :: Key sess -> Value sess -> sess -> sess
 
