diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 ## Changelog
 
+### 0.3.2 (2014-10-21)
+
+* fay-text is now purely a compatibility layer between Fay and GHC. For Fay we reexport `Data.Text` from fay-base.
+
 ### 0.3.1 (2014-10-11)
 
 * Allow `fay 0.21`
diff --git a/fay-text.cabal b/fay-text.cabal
--- a/fay-text.cabal
+++ b/fay-text.cabal
@@ -1,5 +1,5 @@
 name:                fay-text
-version:             0.3.1
+version:             0.3.2
 synopsis:            Fay Text type represented as JavaScript strings
 description:         Text type represented as JavaScript strings for Fay and Data.Text for GHC. Use with OverloadedStrings and RebindableSyntax to have Fay treat string literals as Text.
 homepage:            https://github.com/faylang/fay-text
@@ -27,5 +27,5 @@
   exposed-modules: Fay.Text, Fay.Text.Type
   ghc-options: -Wall
   build-depends: text     <  1.3
-               , fay      >= 0.19 && < 0.22
-               , fay-base == 0.19.*
+               , fay      >= 0.21.2 && < 0.22
+               , fay-base >= 0.19.4 && < 0.20
diff --git a/src/Fay/Text.hs b/src/Fay/Text.hs
--- a/src/Fay/Text.hs
+++ b/src/Fay/Text.hs
@@ -1,5 +1,7 @@
 {-# LANGUAGE CPP                #-}
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE PackageImports     #-}
+{-# LANGUAGE NoImplicitPrelude  #-}
 
 -- | Module to be shared between server and client.
 --
@@ -9,201 +11,56 @@
 --
 
 module Fay.Text
-  ( module Fay.Text.Type
+  -- Only export what's defined in fay-base's Data.Text for both Fay and GHC
+  ( Text
+  -- * Creation and elimination
+  , pack
+  , unpack
+  , fromString
   , empty
+  -- * Breaking into many substrings
+  , splitOn
+  , stripSuffix
+  -- * Basic interface
   , cons
   , snoc
   , append
   , uncons
   , head
+  , init
   , last
   , tail
-  , init
   , null
   , length
+  -- * Special folds
+  , maximum
+  , all
+  , any
+  , concatMap
+  , concat
+  , minimum
+  -- * Case conversion
+  , toLower
+  , toUpper
+  -- * Transformations
   , map
   , intercalate
   , intersperse
   , reverse
-  , toLower
-  , toUpper
-  , concat
-  , concatMap
-  , any
-  , all
-  , maximum
-  , minimum
+  -- * Predicates
+  , isPrefixOf
+  -- * Substrings
+  , drop
+  , take
+  -- * Breaking into lines and words
+  , unlines
+  , lines
   ) where
 
-import           Fay.Text.Type
-import           Prelude (Bool, Char, Int, Maybe)
-
 #ifdef FAY
-import           Data.Data
-import           FFI
-
-empty :: Text
-empty = ffi "''"
-
-cons :: Char -> Text -> Text
-cons = ffi "%1 + %2"
-
-snoc :: Text -> Char -> Text
-snoc = ffi "%1 + %2"
-
-append :: Text -> Text -> Text
-append = ffi "%1 + %2"
-
-uncons :: Text -> Maybe (Char, Text)
-uncons = ffi "%1[0] ? { instance: 'Just', slot1 : [%1[0],%1.slice(1)] } : { instance : 'Nothing' }"
-
-head :: Text -> Char
-head = ffi "%1[0] || (function () {throw new Error('Fay.Text.head: empty Text'); }())"
-
-last :: Text -> Char
-last = ffi "%1.length ? %1[%1.length-1] : (function() { throw new Error('Fay.Text.last: empty Text') })()"
-
-tail :: Text -> Text
-tail = ffi "%1.length ? %1.slice(1) : (function () { throw new Error('Fay.Text.tail: empty Text') })()"
-
-init :: Text -> Text
-init = ffi "%1.length ? %1.slice(0,-1) : (function () { throw new Error('Fay.Text.init: empty Text') })()"
-
-null :: Text -> Bool
-null = ffi "!(%1.length)"
-
-length :: Text -> Int
-length = ffi "%1.length"
-
-map :: (Char -> Char) -> Text -> Text
-map = ffi "[].map.call(%2, %1).join('')"
-
-intercalate :: Text -> [Text] -> Text
-intercalate = ffi "%2.join(%1)"
-
-intersperse :: Char -> Text -> Text
-intersperse = ffi "%2.split('').join(%1)"
-
--- TODO transpose
-
-reverse :: Text -> Text
-reverse = ffi "%1.split('').reverse().join('')"
-
-
--- TODO replace: Can't use String:replace.
-
--- TODO toCaseFold
-
-toLower :: Text -> Text
-toLower = ffi "%1.toLowerCase()"
-
-toUpper :: Text -> Text
-toUpper = ffi "%1.toUpperCase()"
-
--- TODO justifyLeft, justifyRight, center
-
--- TODO foldl, foldl' foldl1', foldr, foldr1
-
-concat :: [Text] -> Text
-concat = ffi "%1.join('')"
-
-concatMap :: (Char -> Text) -> Text -> Text
-concatMap = ffi "[].map.call(%2, %1).join('')"
-
-any :: (Char -> Bool) -> Text -> Bool
-any = ffi "[].filter.call(%2, %1).length > 0"
-
-all :: (Char -> Bool) -> Text -> Bool
-all = ffi "[].filter.call(%2, %1).length == %1.length"
-
-maximum :: Text -> Char
-maximum = ffi "(function (s) { \
-  \   if (s === '') { throw new Error('Fay.Text.maximum: empty string'); } \
-  \   var max = s[0]; \
-  \   for (var i = 1; i < s.length; s++) { \
-  \     if (s[i] > max) { max = s[i]; } \
-  \   } \
-  \   return max; \
-  \ })(%1)"
-
-minimum :: Text -> Char
-minimum = ffi "(function (s) { \
-  \   if (s === '') { throw new Error('Fay.Text.maximum: empty string'); } \
-  \   var min = s[0]; \
-  \   for (var i = 1; i < s.length; s++) { \
-  \     if (s[i] < min) { min = s[i]; } \
-  \   } \
-  \   return min; \
-  \ })(%1)"
-
--- TODO scanl, scanl1, scanr, scanr1
--- TODO mapAccumL, mapAccumR
-
--- TODO replicate, unfoldr, unforldrN, take, drop, takeWhile, dropWhile, dropWhileEnd, dropAround, strip, stripStart, stripEnd, splitAt, breakOn, breakOnEnd, break, span, group, groupBy, inits, tails
-
--- TODO splitOn, split, chunksOf
-
--- TODO lines, words, unlines, unwords
-
--- TODO isPrefixOf, isSuffixOf, isInfixOf
-
--- TODO stripPrefix, stripSuffix, commonPrefixes
-
--- TODO filter, breakOnAll, find, partition
-
--- TODO index, findIndex, count
-
--- TODO zip, zipWith
-
+import "fay-base" Data.Text
 #else
-
-import qualified Data.Text as T
-
-empty       :: Text
-empty       = T.empty
-cons        :: Char -> Text -> Text
-cons        = T.cons
-snoc        :: Text -> Char -> Text
-snoc        = T.snoc
-append      :: Text -> Text -> Text
-append      = T.append
-uncons      :: Text -> Maybe (Char, Text)
-uncons      = T.uncons
-head        :: Text -> Char
-head        = T.head
-last        :: Text -> Char
-last        = T.last
-tail        :: Text -> Text
-tail        = T.tail
-init        :: Text -> Text
-init        = T.init
-null        :: Text -> Bool
-null        = T.null
-length      :: Text -> Int
-length      = T.length
-map         :: (Char -> Char) -> Text -> Text
-map         = T.map
-intercalate :: Text -> [Text] -> Text
-intercalate = T.intercalate
-intersperse :: Char -> Text -> Text
-intersperse = T.intersperse
-reverse     :: Text -> Text
-reverse     = T.reverse
-toLower     :: Text -> Text
-toLower     = T.toLower
-toUpper     :: Text -> Text
-toUpper     = T.toUpper
-concat      :: [Text] -> Text
-concat      = T.concat
-concatMap   :: (Char -> Text) -> Text -> Text
-concatMap   = T.concatMap
-any         :: (Char -> Bool) -> Text -> Bool
-any         = T.any
-all         :: (Char -> Bool) -> Text -> Bool
-all         = T.all
-maximum     :: Text -> Char
-maximum     = T.maximum
-minimum     :: Text -> Char
-minimum     = T.minimum
-
+import "text" Data.Text
 #endif
+
+import Fay.Text.Type (fromString)
diff --git a/src/Fay/Text/Type.hs b/src/Fay/Text/Type.hs
--- a/src/Fay/Text/Type.hs
+++ b/src/Fay/Text/Type.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CPP                #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE EmptyDataDecls     #-}
+{-# LANGUAGE PackageImports     #-}
 
 -- | Module to be shared between server and client.
 --
@@ -18,31 +19,9 @@
 import           Prelude
 
 #ifdef FAY
-
-import           Data.Data
-import           FFI
-
-data Text
-  deriving (Data, Eq, Ord, Read, Show, Typeable)
-
-pack :: String -> Text
-pack = ffi "%1"
-
-unpack :: Text -> String
-unpack = ffi "%1"
-
+import "fay-base" Data.Text (Text, pack, unpack)
 #else
-
-import qualified Data.Text as T
-
-type Text = T.Text
-
-pack :: String -> Text
-pack = T.pack
-
-unpack :: Text -> String
-unpack = T.unpack
-
+import "text" Data.Text (Text, pack, unpack)
 #endif
 
 -- | Have this in scope with the OverloadedStrings and BindableSyntax extensions
