diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+Version 1.1.2
+---------------
+* CI tests
+* Fallback implementation of `stripCommonSuffix @Text` for GHCjs by Jack Kelly
+* Fixed documentation bug #31, Factorial laws too strong
+
 Version 1.1.1
 ---------------
 * Fixed compilation with GHC 8.0.2
diff --git a/Test/TestMonoidSubclasses.hs b/Test/TestMonoidSubclasses.hs
--- a/Test/TestMonoidSubclasses.hs
+++ b/Test/TestMonoidSubclasses.hs
@@ -880,13 +880,13 @@
 
 newtype TestOffsetPositionedString = TestOffsetPositionedString (OffsetPositioned String)
                                      deriving (Show, Arbitrary, CoArbitrary,
-                                               Semigroup, LeftReductive, LeftCancellative,
+                                               Semigroup, LeftReductive,
                                                Monoid, LeftGCDMonoid,
                                                MonoidNull, PositiveMonoid, IsString)
 
 newtype TestLinePositionedString = TestLinePositionedString (LinePositioned String)
                                deriving (Show, Arbitrary, CoArbitrary,
-                                         Semigroup, LeftReductive, LeftCancellative,
+                                         Semigroup, LeftReductive,
                                          Monoid, LeftGCDMonoid,
                                          MonoidNull, PositiveMonoid, IsString)
 
diff --git a/monoid-subclasses.cabal b/monoid-subclasses.cabal
--- a/monoid-subclasses.cabal
+++ b/monoid-subclasses.cabal
@@ -1,10 +1,10 @@
 Name:                monoid-subclasses
-Version:             1.1.1
+Version:             1.1.2
 Cabal-Version:       >= 1.10
 Build-Type:          Simple
 Synopsis:            Subclasses of Monoid
 Category:            Data, Algebra, Text
-Tested-with:         GHC
+Tested-with:         GHC==9.0.1, GHC==8.10.4, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2
 Description:
   A hierarchy of subclasses of 'Monoid' together with their instances for all data structures from base, containers, and
   text packages.
@@ -37,7 +37,7 @@
 
 test-suite Main
   Type:              exitcode-stdio-1.0
-  Build-Depends:     base >= 4.11 && < 5,
+  Build-Depends:     base >= 4.9 && < 5,
                      bytestring >= 0.9 && < 1.0, containers >= 0.5.7.0 && < 0.7, text >= 0.11 && < 1.3,
                      vector >= 0.12 && < 0.13, primes == 0.2.*,
                      QuickCheck >= 2.9 && < 3, quickcheck-instances >= 0.3.12 && <0.4,
diff --git a/src/Data/Monoid/Factorial.hs b/src/Data/Monoid/Factorial.hs
--- a/src/Data/Monoid/Factorial.hs
+++ b/src/Data/Monoid/Factorial.hs
@@ -38,8 +38,8 @@
                        null, reverse, span, splitAt, take, takeWhile)
 
 
--- | Class of monoids that can be split into irreducible (/i.e./, atomic or prime) 'factors' in a unique way. Factors of
--- a 'Product' are literally its prime factors:
+-- | Class of monoids that can be split into irreducible (/i.e./, atomic or prime) 'factors' in a unique way. Note that
+-- 'mempty' is not considered a factor. Factors of a 'Product' are literally its prime factors:
 --
 -- prop> factors (Product 12) == [Product 2, Product 2, Product 3]
 --
diff --git a/src/Data/Monoid/GCD.hs b/src/Data/Monoid/GCD.hs
--- a/src/Data/Monoid/GCD.hs
+++ b/src/Data/Monoid/GCD.hs
@@ -18,7 +18,7 @@
 -- 
 -- * 'OverlappingGCDMonoid'
 
-{-# LANGUAGE Haskell2010, FlexibleInstances, Trustworthy #-}
+{-# LANGUAGE CPP, Haskell2010, FlexibleInstances, Trustworthy #-}
 
 module Data.Monoid.GCD (
    GCDMonoid(..),
@@ -33,10 +33,12 @@
 import qualified Data.ByteString.Unsafe as ByteString
 import qualified Data.ByteString.Lazy as LazyByteString
 import qualified Data.Text as Text
+import qualified Data.Text.Encoding as TextEncoding
 import qualified Data.Text.Internal as Internal
 import qualified Data.Text.Internal.Lazy as LazyInternal
 import           Data.Text.Unsafe (lengthWord16, reverseIter)
 import qualified Data.Text.Lazy as LazyText
+import qualified Data.Text.Lazy.Encoding as LazyEncoding
 import qualified Data.IntMap as IntMap
 import qualified Data.IntSet as IntSet
 import qualified Data.Map as Map
@@ -383,15 +385,22 @@
    stripCommonPrefix x y = maybe (Text.empty, x, y) id (Text.commonPrefixes x y)
 
 -- | @since 1.0
--- /O(suffixLength)/
+-- /O(suffixLength)/, except on GHCjs where it is /O(m+n)/
 instance RightGCDMonoid Text.Text where
-   stripCommonSuffix x@(Internal.Text xarr xoff xlen) y@(Internal.Text yarr yoff ylen) = go (pred xlen) (pred ylen)
+#if !ghcjs_HOST_OS
+  stripCommonSuffix x@(Internal.Text xarr xoff xlen) y@(Internal.Text yarr yoff ylen) = go (pred xlen) (pred ylen)
       where go i j | i >= 0 && j >= 0 && xc == yc = go (i+xd) (j+yd)
                    | otherwise = (Internal.text xarr xoff (succ i),
                                   Internal.text yarr yoff (succ j),
                                   Internal.text xarr (xoff+i+1) (xlen-i-1))
                where (xc, xd) = reverseIter x i
                      (yc, yd) = reverseIter y j
+#else
+  stripCommonSuffix x y =
+    let (xlist, ylist, slist) =
+          stripCommonSuffix (TextEncoding.encodeUtf8 x) (TextEncoding.encodeUtf8 y)
+    in (TextEncoding.decodeUtf8 xlist, TextEncoding.decodeUtf8 ylist, TextEncoding.decodeUtf8 slist)
+#endif
 
 -- Lazy Text instances
 
@@ -402,6 +411,7 @@
 -- | @since 1.0
 -- /O(m+n)/
 instance RightGCDMonoid LazyText.Text where
+#if !ghcjs_HOST_OS
    stripCommonSuffix x0 y0
       | x0len < y0len = go id y0p id x0 y0s
       | x0len > y0len = go x0p id id x0s y0
@@ -431,3 +441,9 @@
                | (x1p, y1p, c1s) <- stripCommonSuffix x y =
                     go (xp . cs . LazyInternal.chunk x1p) (yp . cs . LazyInternal.chunk y1p) (LazyInternal.chunk c1s) xs ys
             go _ _ _ _ _ = error "impossible"
+#else
+  stripCommonSuffix x y =
+    let (xlist, ylist, slist) =
+          stripCommonSuffix (LazyEncoding.encodeUtf8 x) (LazyEncoding.encodeUtf8 y)
+    in (LazyEncoding.decodeUtf8 xlist, LazyEncoding.decodeUtf8 ylist, LazyEncoding.decodeUtf8 slist)
+#endif
diff --git a/src/Data/Semigroup/Factorial.hs b/src/Data/Semigroup/Factorial.hs
--- a/src/Data/Semigroup/Factorial.hs
+++ b/src/Data/Semigroup/Factorial.hs
@@ -52,9 +52,7 @@
 -- 
 -- > maybe id sconcat  . nonEmpty . factors == id
 -- > List.all (\prime-> factors prime == [prime]) . factors
--- > factors . reverse == List.reverse . factors
 -- > primePrefix s == foldr const s s
--- > primeSuffix s == primePrefix (reverse s)
 -- > foldl f a == List.foldl f a . factors
 -- > foldl' f a == List.foldl' f a . factors
 -- > foldr f a == List.foldr f a . factors
@@ -93,9 +91,11 @@
    reverse s = maybe s sconcat (nonEmpty $ List.reverse $ factors s)
    {-# MINIMAL factors | foldr #-}
 
--- | A subclass of 'Factorial' whose instances satisfy this additional law:
+-- | A subclass of 'Factorial' whose instances satisfy the following additional laws:
 --
 -- > factors (a <> b) == factors a <> factors b
+-- > factors . reverse == List.reverse . factors
+-- > primeSuffix s == primePrefix (reverse s)
 class Factorial m => StableFactorial m
 
 instance Factorial () where
