diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,10 @@
+2.0.2
+
+* Support bytestring-0.11.x, criterion-1.5.x, hashable-1.3.x
+* This required pulling in semigroups as a dependency, and NI is now
+  an instance of Semigroup
+
+
 2.0.1
 
 * Expose 'normalized'
@@ -11,176 +18,4 @@
 
 2.0
 
-* New package normalization-insensitive based on case-insensitive
-
-
-1.2.0.5
-
-* Support HUnit-1.3
-* Support criterion-1.1
-* Updated .nix files
-
-
-1.2.0.4
-
-* Fixed #17: https://github.com/basvandijk/case-insensitive/issues/17
-
-
-1.2.0.3
-
-* Add CHANGELOG to extra-source files so that it shows up on Hackage
-
-
-1.2.0.2
-
-* Bump base and deepseq upper bounds for GHC 7.10 compatibility
-
-* Add case-insensitive.nix and default.nix
-
-* Fix #14: Build failure with GHC 7.2.2
-
-* Fix #8: Don't unnecessarily use NoImplicitPrelude
-
-
-1.2.0.1
-
-* Solved warnings on GHC-7.8.3
-
-* Bump text upper version bounds
-
-
-1.2.0.0
-
-* Derived a Data instance for CI
-
-
-1.1.0.3
-
-* Support text-1.1
-
-
-1.1.0.2
-
-* Support text-1.0
-
-
-1.1.0.1
-
-* Fixed bad character L178
-
-
-1.1
-
-* Added the Data.CaseInsensitive.Unsafe module
-
-* Mark Data.CaseInsensitive.Internal as Unsafe
-
-
-1.0.0.2
-
-*  Support criterion-0.8
-
-
-1.0.0.1
-
-* Fix building on GHC-6.12.1
-
-* Bump base upper bound for GHC 7.7
-
-* Added a NEWS file
-
-
-1.0  @  Mon Jan 28 14:39:05 UTC 2013
-
-* Make package ready for the Haskell Platform
-
-* Drop the UnicodeSyntax, TypeSynonymInstances and FlexibleInstances
-  language extensions
-
-* Add instance NFData s => NFData (CI s)
-
-* Add a hidden method to the FoldCase type class:
-    foldCaseList :: [s] -> [s]
-    foldCaseList = L.map foldCase
-
-* Add instance FoldCase a => FoldCase [a] where
-        foldCase = foldCaseList
-
-* Add instance FoldCase Char where
-        foldCase     = toLower
-        foldCaseList = TL.unpack . TL.toCaseFold . TL.pack
-
-* Added a simple test suite
-
-* Added a simple benchmark
-
-* Added a rewrite rule to make 'mk' more efficient on strict
-  ByteStrings
-
-
-0.4.0.4  @  Fri Dec 14 07:06:58 UTC 2012
-
-* Support hashable-1.2
-
-
-0.4.0.3  @  Sat Aug 18 07:20:49 UTC 2012
-
-* Improve performance of foldCase on sctrict and lazy ByteStrings
-
-
-0.4.0.2  @  Thu Aug 16 14:58:33 UTC 2012
-
-* Declare Data.CaseInsensitive to be Trustworthy
-
-* Support base-4.6
-
-* Support bytestring-0.10
-
-
-0.4.0.1  @  Wed Dec 14 15:24:55 UTC 2011
-
-* Support base-4.5
-
-
-0.4  @  Thu Oct 27 18:29:58 UTC 2011
-
-* Remove instance FoldCase Char
-
-* Perform proper case folding on Strings:
-  -instance FoldCase String where foldCase = L.map toLower
-  +instance FoldCase String where foldCase = TL.unpack . TL.toCaseFold . TL.pack
-
-
-0.3.0.1  @  Mon Aug 8 06:28:21 UTC 2011
-
-* Support base-4.4
-
-
-0.3  @  Thu Jul 14 07:38:52 UTC 2011
-
-* Add instance Hashable s => Hashable (CI s)
-
-
-0.2.0.2  @  Thu Jun 30 22:24:23 UTC 2011
-
-* Moved from darcs on code.haskell.org
-  to git on githb.com
-
-
-0.2.0.1  @  Tue Mar 29 20:30:32 UTC 2011
-
-* Drop dependency on base-unicode-symbols
-
-
-0.2  @  Mon Feb 7 20:18:34 UTC 2011
-
-* Export foldedCase :: CI s -> s
-
-* Remove instance FoldCase s ⇒ FoldCase [s]
-
-* Add instance FoldCase String
-
-
-0.1  @  Sun Feb 6 23:54:22 UTC 2011
-
-* Initial release
+* New package normalization-insensitive based on case-insensitive-1.2.0.5
diff --git a/Data/Unicode/NormalizationInsensitive/Internal.hs b/Data/Unicode/NormalizationInsensitive/Internal.hs
--- a/Data/Unicode/NormalizationInsensitive/Internal.hs
+++ b/Data/Unicode/NormalizationInsensitive/Internal.hs
@@ -37,6 +37,7 @@
 import Prelude       ( String, (.), fmap )
 import Text.Read     ( Read, readPrec )
 import Text.Show     ( Show, showsPrec )
+import Data.Semigroup ( Semigroup, (<>) )
 
 -- from bytestring:
 import qualified Data.ByteString      as B  ( ByteString )
@@ -100,6 +101,10 @@
 
 instance (IsString s, Normalizable s) => IsString (NI s) where
     fromString = mk . fromString
+
+instance (Semigroup s, Normalizable s) => Semigroup (NI s) where
+    NI o1 _ <> NI o2 _ = NI o12 (normalize o12)
+      where o12 = o1 <> o2
 
 instance (Monoid s, Normalizable s) => Monoid (NI s) where
     mempty = NI mempty mempty
diff --git a/normalization-insensitive.cabal b/normalization-insensitive.cabal
--- a/normalization-insensitive.cabal
+++ b/normalization-insensitive.cabal
@@ -1,6 +1,6 @@
 name:          normalization-insensitive
-version:       2.0.1
-cabal-version: >=1.8
+version:       2.0.2
+cabal-version: >=1.10
 build-type:    Simple
 license:       BSD3
 license-file:  LICENSE
@@ -18,16 +18,17 @@
                string-like type like: 'String', 'ByteString', 'Text',
                etc.. Comparisons of values of the resulting type will be
                insensitive to normalization.
-
+               .
                This is very similar in spirit to the @case-insensitive@
                package, and is in fact based on the same code.
 tested-with:
-  GHC==7.8.4,
   GHC==7.10.3,
-  GHC==8.0.1,
-  GHC==8.2.1
+  GHC==8.6.5
 
-extra-source-files: README.markdown CHANGELOG pg2189.txt
+extra-source-files: README.markdown
+                  , CHANGELOG
+                  , pg2189.txt
+                  , stack.yaml
 
 source-repository head
   Type:     git
@@ -36,14 +37,17 @@
 Library
   ghc-options: -Wall
   build-depends: base       >= 4.7 && < 5
-               , bytestring >= 0.9 && < 0.11
+               , bytestring >= 0.9 && < 0.12
                , text       >= 1.1.1 && < 1.3
                , deepseq    >= 1.1 && < 1.5
-               , hashable   >= 1.0 && < 1.3
+               , hashable   >= 1.0 && < 1.4
                , unicode-transforms >= 0.1.0.1 && < 0.4
+  if !impl(ghc >= 8.0)
+    build-depends: semigroups >= 0.18 && < 0.19
   exposed-modules: Data.Unicode.NormalizationInsensitive
                  , Data.Unicode.NormalizationInsensitive.Unsafe
   other-modules: Data.Unicode.NormalizationInsensitive.Internal
+  default-language:    Haskell2010
 
 test-suite test-normalization-insensitive
   type:           exitcode-stdio-1.0
@@ -52,14 +56,15 @@
 
   build-depends: normalization-insensitive
                , base                 >= 4.7   && < 5
-               , bytestring           >= 0.9   && < 0.11
+               , bytestring           >= 0.9   && < 0.12
                , text                 >= 1.1.1 && < 1.3
-               , hashable             >= 1.0   && < 1.3
+               , hashable             >= 1.0   && < 1.4
                , HUnit                >= 1.2.2 && < 1.7
                , test-framework       >= 0.2.4 && < 0.9
                , test-framework-hunit >= 0.2.4 && < 0.4
 
   ghc-options: -Wall
+  default-language:    Haskell2010
 
 benchmark bench-normalization-insensitive
   type:           exitcode-stdio-1.0
@@ -71,6 +76,7 @@
 
   build-depends: normalization-insensitive
                , base                 >= 4.7   && < 5
-               , bytestring           >= 0.9   && < 0.11
-               , criterion            >= 0.6.1 && < 1.3
+               , bytestring           >= 0.9   && < 0.12
+               , criterion            >= 0.6.1 && < 1.6
                , deepseq              >= 1.1   && < 1.5
+  default-language:    Haskell2010
diff --git a/stack.yaml b/stack.yaml
new file mode 100644
--- /dev/null
+++ b/stack.yaml
@@ -0,0 +1,43 @@
+# This file was automatically generated by stack init
+# For more information, see: http://docs.haskellstack.org/en/stable/yaml_configuration/
+
+# Specifies the GHC version and set of packages available (e.g., lts-3.5, nightly-2015-09-21, ghc-7.10.2)
+resolver: lts-13.20
+
+# Local packages, usually specified by relative directory name
+packages:
+- '.'
+# Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3)
+extra-deps:
+- binary-0.8.8.0
+- bytestring-0.11.1.0
+- criterion-1.4.0.0
+- hashable-1.3.1.0
+- text-1.2.4.1
+- time-1.8.0.4
+- unicode-transforms-0.3.7.1
+- Win32-2.11.1.0
+
+# Override default flag values for local packages and extra-deps
+flags: {}
+
+# Extra package databases containing global packages
+extra-package-dbs: []
+
+# Control whether we use the GHC we find on the path
+# system-ghc: true
+
+# Require a specific version of stack, using version ranges
+# require-stack-version: -any # Default
+# require-stack-version: >= 1.0.0
+
+# Override the architecture used by stack, especially useful on Windows
+# arch: i386
+# arch: x86_64
+
+# Extra directories used by stack for building
+# extra-include-dirs: [/path/to/dir]
+# extra-lib-dirs: [/path/to/dir]
+
+# Allow a newer minor version of GHC than the snapshot specifies
+# compiler-check: newer-minor
