diff --git a/country.cabal b/country.cabal
--- a/country.cabal
+++ b/country.cabal
@@ -1,5 +1,5 @@
 name: country
-version: 0.1.4
+version: 0.1.5
 synopsis: Country data type and functions
 description:
   The `country` library provides a data type for dealing with
@@ -40,14 +40,14 @@
     Country.Unexposed.TrieByte
     Country.Unexposed.Alias
   build-depends:
-      base >= 4.7 && < 4.11
+      base >= 4.9 && < 4.12
     , text >= 1.2 && < 1.3
     , bytestring >= 0.10 && < 0.11
     , primitive >= 0.6.1 && < 0.7
     , unordered-containers >= 0.2 && < 0.3
     , ghc-prim >= 0.5 && < 0.6
     , hashable >= 1.2 && < 1.3
-    , aeson >= 0.11 && < 1.3
+    , aeson >= 0.11 && < 1.4
     , scientific >= 0.3 && < 0.4
     , attoparsec >= 0.13 && < 0.14
   default-language: Haskell2010
diff --git a/src/Country.hs b/src/Country.hs
--- a/src/Country.hs
+++ b/src/Country.hs
@@ -31,8 +31,7 @@
 import Data.Text (Text)
 import Data.ByteString (ByteString)
 import Data.Word (Word16)
-import Data.Primitive (indexArray,writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray)
-import Data.Primitive.Array (Array(..))
+import Data.Primitive (writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray)
 import Data.Primitive.ByteArray (ByteArray(..))
 import GHC.Prim (sizeofByteArray#,sizeofArray#)
 import GHC.Int (Int(..))
diff --git a/src/Country/Unexposed/Names.hs b/src/Country/Unexposed/Names.hs
--- a/src/Country/Unexposed/Names.hs
+++ b/src/Country/Unexposed/Names.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE MagicHash #-}
 {-# LANGUAGE UnboxedTuples #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE TypeInType #-}
 
 {-# OPTIONS_HADDOCK not-home #-}
 
@@ -39,7 +40,7 @@
 import Foreign.Storable (Storable)
 import Data.Text (Text)
 import Data.Word
-import Data.Char (toLower,isAlpha)
+import Data.Char (toLower,isAlpha,toUpper)
 import Country.Unexposed.Encode.English (countryNameQuads)
 import Data.Primitive (Array,indexArray,newArray,unsafeFreezeArray,writeArray,
   writeByteArray,indexByteArray,unsafeFreezeByteArray,newByteArray,sizeOf)
@@ -65,7 +66,7 @@
 {-# NOINLINE englishIdentifierNamesText #-}
 
 toIdentifier :: Text -> Text
-toIdentifier t = case (T.uncons . T.filter isAlpha . T.toTitle) t of
+toIdentifier t = case (T.uncons . T.filter isAlpha . slowToTitle) t of
   Nothing -> T.empty
   Just (b,bs) -> T.cons (toLower b) bs
 
@@ -85,9 +86,19 @@
   let baseMap = HM.union alphaTwoHashMap alphaThreeHashMap
       hm1 = L.foldl' (\hm (countryNum,name) -> HM.insert name (Country countryNum) hm) baseMap aliases
       hm2 = L.foldl' (\hm (countryNum,name,_,_) -> HM.insert name (Country countryNum) hm) hm1 countryNameQuads
-      hm3 = HM.foldlWithKey' (\hm name cty -> HM.insert (T.toLower name) cty $ HM.insert (T.toTitle name) cty $ hm) hm2 hm2
+      hm3 = HM.foldlWithKey' (\hm name cty -> HM.insert (T.toLower name) cty $ HM.insert (slowToTitle name) cty $ hm) hm2 hm2
    in hm3
 {-# NOINLINE decodeMap #-}
+
+-- This is only needed to support the reflex-platform fork of text. Fortunately,
+-- in all the places this is needed, it is only called to build CAFs.
+slowToTitle :: Text -> Text
+slowToTitle = T.intercalate (T.singleton ' ') . map upperFirst . T.splitOn (T.singleton ' ')
+
+upperFirst :: Text -> Text
+upperFirst t = case T.uncons t of
+  Nothing -> T.empty
+  Just (c,cs) -> T.cons (toUpper c) cs
 
 decodeMapUtf8 :: HashMap ByteString Country
 decodeMapUtf8 = HM.foldlWithKey' (\hm k v -> HM.insert (encodeUtf8 k) v hm) HM.empty decodeMap
diff --git a/src/Country/Unexposed/Trie.hs b/src/Country/Unexposed/Trie.hs
--- a/src/Country/Unexposed/Trie.hs
+++ b/src/Country/Unexposed/Trie.hs
@@ -7,10 +7,12 @@
 import Data.HashMap.Strict (HashMap)
 import Data.Word (Word16)
 import Data.Text (Text)
+import Data.Semigroup (Semigroup)
 import Control.Applicative ((<|>))
 import qualified Data.Text as T
 import qualified Data.HashMap.Strict as HM
 import qualified Data.Attoparsec.Text as AT
+import qualified Data.Semigroup as SG
 
 -- | If the value is not the max Word16 (65535), there 
 --   is a match. This means that 65535 cannot be used, which 
@@ -36,9 +38,12 @@
     Just (char,nameNext) -> Trie placeholder (HM.singleton char (go nameNext))
     Nothing -> Trie code HM.empty
 
+instance Semigroup Trie where
+  (<>) = mappend
+
 instance Monoid Trie where
   mempty = empty
-  mappend = append
+  mappend = (SG.<>)
 
 trieFromList :: [(Text,Word16)] -> Trie
 trieFromList = foldMap (uncurry singleton)
diff --git a/src/Country/Unexposed/TrieByte.hs b/src/Country/Unexposed/TrieByte.hs
--- a/src/Country/Unexposed/TrieByte.hs
+++ b/src/Country/Unexposed/TrieByte.hs
@@ -7,10 +7,12 @@
 import Data.HashMap.Strict (HashMap)
 import Data.Word (Word16,Word8)
 import Data.ByteString (ByteString)
+import Data.Semigroup (Semigroup)
 import Control.Applicative ((<|>))
 import qualified Data.ByteString as B
 import qualified Data.HashMap.Strict as HM
 import qualified Data.Attoparsec.ByteString as AB
+import qualified Data.Semigroup as SG
 
 -- | If the value is not the max Word16 (65535), there 
 --   is a match. This means that 65535 cannot be used, which 
@@ -36,9 +38,12 @@
     Just (char,nameNext) -> TrieByte placeholder (HM.singleton char (go nameNext))
     Nothing -> TrieByte code HM.empty
 
+instance Semigroup TrieByte where
+  (<>) = append
+
 instance Monoid TrieByte where
   mempty = empty
-  mappend = append
+  mappend = (SG.<>)
 
 trieByteFromList :: [(ByteString,Word16)] -> TrieByte
 trieByteFromList = foldMap (uncurry singleton)
