diff --git a/Data/Text.hs b/Data/Text.hs
--- a/Data/Text.hs
+++ b/Data/Text.hs
@@ -191,6 +191,7 @@
 
     -- * Low level operations
     , copy
+    , unpackCString#
     ) where
 
 import Prelude (Char, Bool(..), Int, Maybe(..), String,
@@ -220,7 +221,7 @@
 import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
 import Data.Text.Internal.Private (span_)
 import Data.Text.Internal (Text(..), empty, firstf, mul, safe, text)
-import Data.Text.Show (singleton, unpack)
+import Data.Text.Show (singleton, unpack, unpackCString#)
 import qualified Prelude as P
 import Data.Text.Unsafe (Iter(..), iter, iter_, lengthWord16, reverseIter,
                          reverseIter_, unsafeHead, unsafeTail)
diff --git a/Data/Text/Show.hs b/Data/Text/Show.hs
--- a/Data/Text/Show.hs
+++ b/Data/Text/Show.hs
@@ -17,6 +17,7 @@
     (
       singleton
     , unpack
+    , unpackCString#
     ) where
 
 import Control.Monad.ST (ST)
@@ -41,7 +42,10 @@
 unpack = S.unstreamList . stream
 {-# INLINE [1] unpack #-}
 
--- | /O(n)/ Convert a literal string into a Text.  Subject to fusion.
+-- | /O(n)/ Convert a literal string into a 'Text'.  Subject to
+-- fusion.
+--
+-- This is exposed solely for people writing GHC rewrite rules.
 unpackCString# :: Addr# -> Text
 unpackCString# addr# = unstream (S.streamCString# addr#)
 {-# NOINLINE unpackCString# #-}
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+1.2.1.1
+
+* Expose unpackCString#, which you should never use.
+
 1.2.1.0
 
 * Added Binary instances for both Text types. (If you have previously
diff --git a/text.cabal b/text.cabal
--- a/text.cabal
+++ b/text.cabal
@@ -1,5 +1,5 @@
 name:           text
-version:        1.2.1.0
+version:        1.2.1.1
 homepage:       https://github.com/bos/text
 bug-reports:    https://github.com/bos/text/issues
 synopsis:       An efficient packed Unicode text type.
