diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Change log for [raaz].
 
+## [0.2.1] - 25 March, 2019
+
+This is a minor release just to get the latest ghc.
+
+* Get raaz to work with latest ghcs.
+
 ## [0.2.0] - 24 August, 2017
 
 * Some cpu detection builtin for GCC. Would come handy in future for
@@ -67,4 +73,5 @@
 [0.1.0]: <http://github.com/raaz-crypto/raaz/releases/tag/v0.1.0>
 [0.1.1]: <http://github.com/raaz-crypto/raaz/releases/tag/v0.1.1>
 [0.2.0]: <http://github.com/raaz-crypto/raaz/releases/tag/v0.2.0>
+[0.2.1]: <http://github.com/raaz-crypto/raaz/releases/tag/v0.2.1>
 [raaz]:  <http://github.com/raaz-crypto/raaz/>
diff --git a/Raaz/Core/Encode/Base16.hs b/Raaz/Core/Encode/Base16.hs
--- a/Raaz/Core/Encode/Base16.hs
+++ b/Raaz/Core/Encode/Base16.hs
@@ -1,5 +1,6 @@
 -- | Base 16 or hexadecimal encoding of objects.
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE CPP                        #-}
 module Raaz.Core.Encode.Base16
        ( Base16
        , fromBase16, showBase16
@@ -28,7 +29,12 @@
 -- are exposed mainly to make these definitions easy.
 --
 
-newtype Base16 = Base16 {unBase16 :: ByteString} deriving (Eq, Monoid)
+newtype Base16 = Base16 {unBase16 :: ByteString}
+#if MIN_VERSION_base(4,11,0)
+                 deriving (Eq, Semigroup, Monoid)
+#else
+                 deriving (Eq, Monoid)
+#endif
 
 -- Developers note: Internally base16 just stores the bytestring as
 -- is. The conversion happens when we do an encode and decode of
diff --git a/Raaz/Core/Encode/Base64.hs b/Raaz/Core/Encode/Base64.hs
--- a/Raaz/Core/Encode/Base64.hs
+++ b/Raaz/Core/Encode/Base64.hs
@@ -1,5 +1,6 @@
 -- | Base 64 encoding of objects.
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE CPP                        #-}
 module Raaz.Core.Encode.Base64( Base64 ) where
 
 import Data.Char
@@ -18,7 +19,13 @@
 
 -- | The type corresponding to the standard padded base-64 binary
 -- encoding.
-newtype Base64 = Base64 {unBase64 :: ByteString} deriving (Eq, Monoid)
+newtype Base64 = Base64 {unBase64 :: ByteString}
+#if MIN_VERSION_base(4,11,0)
+                 deriving (Eq, Semigroup, Monoid)
+#else
+                 deriving (Eq, Monoid)
+#endif
+
 
 -- Developers note: Internally base16 just stores the bytestring as
 -- is. The conversion happens when we do an encode and decode of
diff --git a/Raaz/Core/MonoidalAction.hs b/Raaz/Core/MonoidalAction.hs
--- a/Raaz/Core/MonoidalAction.hs
+++ b/Raaz/Core/MonoidalAction.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE MultiParamTypeClasses      #-}
 {-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE CPP                        #-}
 
 -- | A module that abstracts out monoidal actions.
 module Raaz.Core.MonoidalAction
@@ -90,6 +91,12 @@
 -- a semidirect product.
 data SemiR space m = SemiR space !m
 
+#if MIN_VERSION_base(4,11,0)
+
+instance Distributive m space => Semigroup (SemiR space m) where
+  (<>) (SemiR x a) (SemiR y b) = SemiR (x `mappend`  (a <.> y))  (a `mappend` b)
+
+#endif
 
 instance Distributive m space => Monoid (SemiR space m) where
 
diff --git a/Raaz/Core/Primitives.hs b/Raaz/Core/Primitives.hs
--- a/Raaz/Core/Primitives.hs
+++ b/Raaz/Core/Primitives.hs
@@ -93,6 +93,11 @@
 newtype BLOCKS p = BLOCKS {unBLOCKS :: Int}
                  deriving (Show, Eq, Ord, Enum)
 
+#if MIN_VERSION_base(4,11,0)
+instance Semigroup (BLOCKS p) where
+  (<>) x y = BLOCKS $ unBLOCKS x + unBLOCKS y
+#endif
+
 instance Monoid (BLOCKS p) where
   mempty      = BLOCKS 0
   mappend x y = BLOCKS $ unBLOCKS x + unBLOCKS y
diff --git a/Raaz/Core/Transfer.hs b/Raaz/Core/Transfer.hs
--- a/Raaz/Core/Transfer.hs
+++ b/Raaz/Core/Transfer.hs
@@ -5,7 +5,7 @@
 {-# LANGUAGE FlexibleInstances          #-}
 {-# LANGUAGE MultiParamTypeClasses      #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
-
+{-# LANGUAGE CPP                        #-}
 
 module Raaz.Core.Transfer
        ( -- * Transfer actions.
@@ -64,6 +64,12 @@
 -- | This monoid captures a transfer action.
 newtype TransferM m = TransferM { unTransferM :: m () }
 
+#if MIN_VERSION_base(4,11,0)
+instance Monad m => Semigroup (TransferM m) where
+  (<>) wa wb = TransferM $ unTransferM wa >> unTransferM wb
+#endif
+
+
 instance Monad m => Monoid (TransferM m) where
   mempty        = TransferM $ return ()
   {-# INLINE mempty #-}
@@ -99,8 +105,14 @@
 -- | An element of type `WriteM m` is an action which when executed transfers bytes
 -- /into/ its input buffer.  The type @`WriteM` m@ forms a monoid and
 -- hence can be concatnated using the `<>` operator.
-newtype WriteM m = WriteM { unWriteM :: Transfer m } deriving Monoid
+newtype WriteM m = WriteM { unWriteM :: Transfer m }
+#if MIN_VERSION_base(4,11,0)
+                 deriving (Semigroup, Monoid)
+#else
+                 deriving Monoid
+#endif
 
+
 -- | A write io-action.
 type WriteIO = WriteM IO
 
@@ -258,7 +270,12 @@
 -- data associated from @r1@ and then the read associated with the
 -- data @r2@.
 
-newtype ReadM m = ReadM { unReadM :: Transfer m} deriving Monoid
+newtype ReadM m = ReadM { unReadM :: Transfer m}
+#if MIN_VERSION_base(4,11,0)
+                 deriving (Semigroup, Monoid)
+#else
+                 deriving Monoid
+#endif
 
 -- | A read io-action.
 type ReadIO = ReadM IO
diff --git a/Raaz/Core/Types/Equality.hs b/Raaz/Core/Types/Equality.hs
--- a/Raaz/Core/Types/Equality.hs
+++ b/Raaz/Core/Types/Equality.hs
@@ -261,6 +261,11 @@
 -- AND of two comparisons in a timing safe way.
 newtype Result =  Result { unResult :: Word }
 
+#if MIN_VERSION_base(4,11,0)
+instance Semigroup Result where
+    (<>) a b = Result (unResult a .|. unResult b)
+#endif
+
 instance Monoid Result where
   mempty      = Result 0
   mappend a b = Result (unResult a .|. unResult b)
diff --git a/Raaz/Core/Types/Pointer.hs b/Raaz/Core/Types/Pointer.hs
--- a/Raaz/Core/Types/Pointer.hs
+++ b/Raaz/Core/Types/Pointer.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses      #-}
 {-# LANGUAGE FlexibleInstances          #-}
@@ -122,11 +123,24 @@
                  deriving ( Show, Eq,Ord, Enum, Integral
                           , Real, Num, Storable
                           )
+#if MIN_VERSION_base(4,11,0)
 
+instance Num a => Semigroup (BYTES a) where
+  (<>) = (+)
+
+#endif
+
 instance Num a => Monoid (BYTES a) where
   mempty  = 0
   mappend = (+)
 
+#if MIN_VERSION_base(4,11,0)
+
+instance Semigroup ALIGN where
+  (<>) x y = ALIGN $ unALIGN x + unALIGN y
+
+#endif
+
 instance Monoid ALIGN where
   mempty  = ALIGN 0
   mappend x y = ALIGN $ unALIGN x + unALIGN y
@@ -237,6 +251,12 @@
 -- | The default alignment to use is word boundary.
 wordAlignment :: Alignment
 wordAlignment = alignment (undefined :: Align)
+
+#if MIN_VERSION_base(4,11,0)
+
+instance Semigroup Alignment where
+  (<>) = lcm
+#endif
 
 instance Monoid Alignment where
   mempty  = Alignment 1
diff --git a/Raaz/Hash/Internal/HMAC.hs b/Raaz/Hash/Internal/HMAC.hs
--- a/Raaz/Hash/Internal/HMAC.hs
+++ b/Raaz/Hash/Internal/HMAC.hs
@@ -1,6 +1,6 @@
 -- |The HMAC construction for a cryptographic hash
 
-
+{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE TypeFamilies               #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE FlexibleContexts           #-}
@@ -56,7 +56,12 @@
 -- are shortened by applying the appropriate hash. As a result the
 -- `show` and `fromString` need not be inverses of each other.
 --
-newtype HMACKey h = HMACKey { unKey :: B.ByteString } deriving Monoid
+newtype HMACKey h = HMACKey { unKey :: B.ByteString }
+#if MIN_VERSION_base(4,11,0)
+                 deriving (Semigroup, Monoid)
+#else
+                 deriving Monoid
+#endif
 
 instance (Hash h, Recommendation h) => Storable (HMACKey h) where
 
diff --git a/raaz.cabal b/raaz.cabal
--- a/raaz.cabal
+++ b/raaz.cabal
@@ -1,5 +1,5 @@
 name:    raaz
-version: 0.2.0
+version: 0.2.1
 
 synopsis: The raaz cryptographic library.
 
@@ -170,7 +170,7 @@
                , Raaz.Random.ChaCha20PRG
                , Raaz.Entropy
                , Paths_raaz
-  build-depends: base                           >= 4.6  &&  < 4.11
+  build-depends: base                           >= 4.6  &&  < 4.13
                , bytestring                     >= 0.9  &&  < 0.11
                , deepseq                        >= 1.1  &&  < 1.5
                , vector                         >= 0.7.1 && < 0.13
@@ -335,6 +335,7 @@
                , transformers
                , raaz
                , vector
+  build-tool-depends: hspec-discover:hspec-discover
 
 -------------------------- Liquid haskell verification -------------------------------------
 
