diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,6 @@
+
+## 1.0.0
+
+  * GHC 8.4 compatibility.
+  * Drop support for GHC < 8.0.
+
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+# REdis Serialisation Protocol (RESP)
+
+This library provides [RESP][1] encoding/decoding functionality and
+defines most of the available Redis [commands][2] as a GADT which
+enables different interpreter implementations such as [redis-io][3].
+
+[1]: http://redis.io/topics/protocol
+[2]: http://redis.io/commands
+[3]: https://gitlab.com/twittner/redis-io
diff --git a/redis-resp.cabal b/redis-resp.cabal
--- a/redis-resp.cabal
+++ b/redis-resp.cabal
@@ -1,26 +1,29 @@
-name:                redis-resp
-version:             0.4.0
-synopsis:            REdis Serialization Protocol (RESP) implementation.
-license:             MPL-2.0
-license-file:        LICENSE
-author:              Toralf Wittner
-maintainer:          Toralf Wittner <tw@dtex.org>
-copyright:           (C) 2014 Toralf Wittner
-homepage:            https://gitlab.com/twittner/redis-resp/
-bug-reports:         https://gitlab.com/twittner/redis-resp/issues
-stability:           experimental
-category:            Data
-build-type:          Simple
-cabal-version:       >= 1.10
+name:          redis-resp
+version:       1.0.0
+synopsis:      REdis Serialization Protocol (RESP) implementation.
+license:       MPL-2.0
+license-file:  LICENSE
+author:        Toralf Wittner
+maintainer:    Toralf Wittner <tw@dtex.org>, Roman S. Borschel <roman@pkaboo.org>
+copyright:     (C) 2014 Toralf Wittner
+homepage:      https://gitlab.com/twittner/redis-resp/
+bug-reports:   https://gitlab.com/twittner/redis-resp/issues
+category:      Data
+build-type:    Simple
+cabal-version: >= 1.10
 
 description:
     REdis Serialization Protocol (RESP) implementation as specified
     in <http://redis.io/topics/protocol>.
     .
-    Additionally most Redis commands are declared as an GADT which
+    Most Redis commands are declared as a GADT which
     enables different interpretations such as
     <http://hackage.haskell.org/package/redis-io redis-io>.
 
+extra-source-files:
+    README.md
+    CHANGELOG.md
+
 source-repository head
     type:             git
     location:         git://gitlab.com/twittner/redis-resp.git
@@ -37,7 +40,7 @@
 
     build-depends:
         attoparsec            >= 0.11
-      , base                  >= 4.6    && < 5
+      , base                  >= 4.9    && < 5
       , bytestring            >= 0.10.4
       , bytestring-conversion >= 0.2
       , containers            >= 0.5
diff --git a/src/Data/Redis/Command.hs b/src/Data/Redis/Command.hs
--- a/src/Data/Redis/Command.hs
+++ b/src/Data/Redis/Command.hs
@@ -233,7 +233,6 @@
     , NE.nonEmpty
     ) where
 
-import Control.Applicative
 import Control.Exception (Exception)
 import Control.Monad.Operational
 import Data.ByteString.Builder (int64Dec)
@@ -247,8 +246,8 @@
 import Data.List.NonEmpty (NonEmpty (..), (<|))
 import Data.List.Split (chunksOf)
 import Data.Maybe (maybeToList)
-import Data.Monoid hiding (Sum)
 import Data.Redis.Resp
+import Data.Semigroup (Semigroup, (<>))
 import Data.String
 import Data.Typeable
 import GHC.TypeLits
@@ -523,9 +522,12 @@
 -- | Command options
 data Opts (a :: Symbol) = Opts { len :: !Int, opts :: DList ByteString }
 
+instance Semigroup (Opts a) where
+    Opts x a <> Opts y b = Opts (x + y) (a `DL.append` b)
+
 instance Monoid (Opts a) where
     mempty = Opts 0 DL.empty
-    Opts x a `mappend` Opts y b = Opts (x + y) (a `DL.append` b)
+    mappend = (<>)
 
 none :: Monoid m => m
 none = mempty
@@ -536,13 +538,19 @@
 newtype BitStart     = BitStart ByteString
 newtype BitEnd       = BitEnd   ByteString
 
+instance Semigroup BitStart where
+    _ <> b = b
+
 instance Monoid BitStart where
-    mempty        = BitStart ""
-    _ `mappend` b = b
+    mempty  = BitStart ""
+    mappend = (<>)
 
+instance Semigroup BitEnd where
+    _ <> b = b
+
 instance Monoid BitEnd where
-    mempty        = BitEnd ""
-    _ `mappend` b = b
+    mempty  = BitEnd ""
+    mappend = (<>)
 
 start :: Int64 -> BitStart
 start = BitStart . int2bytes
@@ -598,6 +606,33 @@
 -----------------------------------------------------------------------------
 -- Transactions
 
+-- | Note that all commands following 'multi' and until 'exec' are queued by
+-- a Redis server. Therefore the result of any such command is not available
+-- until the exec command completes. For example, the following is an invalid
+-- 'Redis' program:
+--
+-- @
+--  multi
+--  x <- hexists \"FOO\" \"BAR\"
+--  unless x (void $ hset \"FOO\" \"BAR\" 1)
+--  exec
+-- @
+--
+-- This pattern is usually indicative of the desire for a transactional
+-- check-and-set operation, which may be achieved instead by the following
+-- valid command sequence:
+--
+-- @
+--  watch (\"FOO\" R.:| [])
+--  x <- hexists \"FOO\" \"BAR\"
+--  multi
+--  unless x (void $ hset \"FOO\" \"BAR\" 1)
+--  exec
+-- @
+--
+--
+-- For more information on Redis transactions and conditional updates,
+-- see https://redis.io/topics/transactions.
 multi :: Monad m => Redis m ()
 multi = singleton $ Multi $ cmd 1 ["MULTI"]
 
