diff --git a/Data/ByteString/Interned.hs b/Data/ByteString/Interned.hs
--- a/Data/ByteString/Interned.hs
+++ b/Data/ByteString/Interned.hs
@@ -1,46 +1,6 @@
-{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
 module Data.ByteString.Interned
   ( InternedByteString(..)
   ) where
 
-import Data.String
-import Data.Interned
-import Data.ByteString
-import Data.ByteString.Char8 as Char8
-import Data.Hashable
-import Data.Function (on)
-
-data InternedByteString = InternedByteString 
-  {-# UNPACK #-} !(Id InternedByteString)
-  {-# UNPACK #-} !ByteString
-
-instance IsString InternedByteString where
-  fromString = intern . Char8.pack
-
-instance Eq InternedByteString where
-  (==) = (==) `on` identity
-
-instance Ord InternedByteString where
-  compare = compare `on` identity
-
-instance Show InternedByteString where
-  showsPrec d (InternedByteString _ b) = showsPrec d b
-
-instance Interned InternedByteString where
-  type Uninterned InternedByteString = ByteString
-  data Description InternedByteString = DBS {-# UNPACK #-} !ByteString
-    deriving (Eq) 
-  describe = DBS
-  identify = InternedByteString
-  identity (InternedByteString i _) = i
-  cache = ibsCache
-
-instance Uninternable InternedByteString where
-  unintern (InternedByteString _ b) = b 
-
-instance Hashable (Description InternedByteString) where
-  hash (DBS h) = hash h
+import Data.ByteString.Interned.Internal
 
-ibsCache :: Cache InternedByteString
-ibsCache = mkCache
-{-# NOINLINE ibsCache #-}
diff --git a/Data/ByteString/Interned/Internal.hs b/Data/ByteString/Interned/Internal.hs
new file mode 100644
--- /dev/null
+++ b/Data/ByteString/Interned/Internal.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
+module Data.ByteString.Interned.Internal
+  ( InternedByteString(..)
+  ) where
+
+import Data.String
+import Data.Interned
+import Data.ByteString
+import Data.ByteString.Char8 as Char8
+import Data.Hashable
+import Data.Function (on)
+
+data InternedByteString = InternedByteString 
+  {-# UNPACK #-} !Id
+  {-# UNPACK #-} !ByteString
+
+instance IsString InternedByteString where
+  fromString = intern . Char8.pack
+
+instance Eq InternedByteString where
+  (==) = (==) `on` identity
+
+instance Ord InternedByteString where
+  compare = compare `on` identity
+
+instance Show InternedByteString where
+  showsPrec d (InternedByteString _ b) = showsPrec d b
+
+instance Interned InternedByteString where
+  type Uninterned InternedByteString = ByteString
+  data Description InternedByteString = DBS {-# UNPACK #-} !ByteString deriving (Eq) 
+  describe = DBS
+  identify = InternedByteString
+  identity (InternedByteString i _) = i
+  cache = ibsCache
+
+instance Uninternable InternedByteString where
+  unintern (InternedByteString _ b) = b 
+
+instance Hashable (Description InternedByteString) where
+  hash (DBS h) = hash h
+
+ibsCache :: Cache InternedByteString
+ibsCache = mkCache
+{-# NOINLINE ibsCache #-}
diff --git a/Data/Interned.hs b/Data/Interned.hs
--- a/Data/Interned.hs
+++ b/Data/Interned.hs
@@ -4,7 +4,7 @@
   , mkCache
   , Cache
   , cacheSize
-  , Id(..)
+  , Id
   , intern
   ) where
 
diff --git a/Data/Interned/Internal.hs b/Data/Interned/Internal.hs
--- a/Data/Interned/Internal.hs
+++ b/Data/Interned/Internal.hs
@@ -10,7 +10,7 @@
   , Cache(..)
   , CacheState(..)
   , cacheSize
-  , Id(..)
+  , Id
   , intern
   ) where
 
@@ -22,7 +22,7 @@
 import System.Mem.Weak
 
 data CacheState t = CacheState 
-   {-# UNPACK #-} !(Id t) 
+   {-# UNPACK #-} !Id
    !(HashMap (Description t) (Weak t))
 
 newtype Cache t = Cache { getCache :: MVar (CacheState t) }
@@ -35,11 +35,7 @@
 mkCache :: Cache t
 mkCache = Cache $ unsafePerformIO $ newMVar $ CacheState 0 HashMap.empty
 
-newtype Id t = Id Int deriving (Eq,Ord,Show,Num,Real,Integral,Enum)
-
-instance Hashable (Id t) where
-  hash (Id t) = hash t
-  hashWithSalt s (Id t) = hashWithSalt s t
+type Id = Int
 
 class ( Eq (Description t)
       , Hashable (Description t)
@@ -47,8 +43,8 @@
   data Description t
   type Uninterned t
   describe :: Uninterned t -> Description t 
-  identify :: Id t -> Uninterned t -> t
-  identity :: t -> Id t
+  identify :: Id -> Uninterned t -> t
+  identity :: t -> Id
   cache    :: Cache t
 
 class Interned t => Uninternable t where
diff --git a/Data/String/Interned.hs b/Data/String/Interned.hs
--- a/Data/String/Interned.hs
+++ b/Data/String/Interned.hs
@@ -1,47 +1,5 @@
-{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
 module Data.String.Interned
-  ( InternedString(..)
+  ( InternedString
   ) where
 
-import Data.String
-import Data.Interned
-import Data.Hashable
-import Data.Foldable
-import Data.Function (on)
-
-data InternedString = IS 
-  {-# UNPACK #-} !(Id InternedString)
-  String
-
-instance IsString InternedString where
-  fromString = intern
-
-instance Eq InternedString where
-  (==) = (==) `on` identity
-
-instance Ord InternedString where
-  compare = compare `on` identity
-
-instance Show InternedString where
-  showsPrec d (IS _ b) = showsPrec d b
-
-instance Interned InternedString where
-  type Uninterned InternedString = String
-  data Description InternedString = Cons {-# UNPACK #-} !Char String | Nil
-    deriving (Eq) 
-  describe (c:cs) = Cons c cs
-  describe []     = Nil
-  identify = IS
-  identity (IS i _) = i
-  cache = stringCache
-
-instance Uninternable InternedString where
-  unintern (IS _ b) = b 
-
-instance Hashable (Description InternedString) where
-  hash (Cons c s) = foldl' hashWithSalt (hashWithSalt 0 c) s
-  hash Nil        = 0
-
-stringCache :: Cache InternedString
-stringCache = mkCache
-{-# NOINLINE stringCache #-}
+import Data.String.Interned.Internal
diff --git a/Data/String/Interned/Internal.hs b/Data/String/Interned/Internal.hs
new file mode 100644
--- /dev/null
+++ b/Data/String/Interned/Internal.hs
@@ -0,0 +1,47 @@
+{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
+module Data.String.Interned.Internal
+  ( InternedString(..)
+  ) where
+
+import Data.String
+import Data.Interned
+import Data.Hashable
+import Data.Foldable
+import Data.Function (on)
+
+data InternedString = IS 
+  {-# UNPACK #-} !Id
+  String
+
+instance IsString InternedString where
+  fromString = intern
+
+instance Eq InternedString where
+  (==) = (==) `on` identity
+
+instance Ord InternedString where
+  compare = compare `on` identity
+
+instance Show InternedString where
+  showsPrec d (IS _ b) = showsPrec d b
+
+instance Interned InternedString where
+  type Uninterned InternedString = String
+  data Description InternedString = Cons {-# UNPACK #-} !Char String | Nil
+    deriving (Eq) 
+  describe (c:cs) = Cons c cs
+  describe []     = Nil
+  identify = IS
+  identity (IS i _) = i
+  cache = stringCache
+
+instance Uninternable InternedString where
+  unintern (IS _ b) = b 
+
+instance Hashable (Description InternedString) where
+  hash (Cons c s) = foldl' hashWithSalt (hashWithSalt 0 c) s
+  hash Nil        = 0
+
+stringCache :: Cache InternedString
+stringCache = mkCache
+{-# NOINLINE stringCache #-}
diff --git a/Data/Text/Interned.hs b/Data/Text/Interned.hs
new file mode 100644
--- /dev/null
+++ b/Data/Text/Interned.hs
@@ -0,0 +1,5 @@
+module Data.Text.Interned
+  ( InternedText
+  ) where
+
+import Data.Text.Interned.Internal
diff --git a/Data/Text/Interned/Internal.hs b/Data/Text/Interned/Internal.hs
new file mode 100644
--- /dev/null
+++ b/Data/Text/Interned/Internal.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
+module Data.Text.Interned.Internal
+  ( InternedText(..)
+  ) where
+
+import Data.String
+import Data.Interned
+import Data.Text
+import Data.Hashable
+import Data.Function (on)
+
+data InternedText = InternedText 
+  {-# UNPACK #-} !Id
+  {-# UNPACK #-} !Text
+
+instance IsString InternedText where
+  fromString = intern . pack
+
+instance Eq InternedText where
+  (==) = (==) `on` identity
+
+instance Ord InternedText where
+  compare = compare `on` identity
+
+instance Show InternedText where
+  showsPrec d (InternedText _ b) = showsPrec d b
+
+instance Interned InternedText where
+  type Uninterned InternedText = Text
+  data Description InternedText = DT {-# UNPACK #-} !Text deriving (Eq) 
+  describe = DT
+  identify = InternedText
+  identity (InternedText i _) = i
+  cache = itCache
+
+instance Uninternable InternedText where
+  unintern (InternedText _ b) = b 
+
+instance Hashable (Description InternedText) where
+  hash (DT h) = hash h
+
+itCache :: Cache InternedText
+itCache = mkCache
+{-# NOINLINE itCache #-}
diff --git a/intern.cabal b/intern.cabal
--- a/intern.cabal
+++ b/intern.cabal
@@ -1,6 +1,6 @@
 name:          intern
 category:      Data, Data Structures
-version:       0.2.2.1
+version:       0.3.0
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
@@ -23,13 +23,18 @@
   build-depends: 
     base >= 4 && < 5,
     bytestring >= 0.9.1 && < 0.10,
-    unordered-containers >= 0.1.4 && < 0.2,
-    hashable >= 1.1.2 && < 1.2
+    text >= 0.11.1.5 && < 0.12,
+    hashable >= 1.1.2 && < 1.2,
+    unordered-containers >= 0.1.4 && < 0.2
 
   exposed-modules:
     Data.Interned
     Data.Interned.Internal
     Data.ByteString.Interned
+    Data.ByteString.Interned.Internal
     Data.String.Interned
+    Data.String.Interned.Internal
+    Data.Text.Interned
+    Data.Text.Interned.Internal
 
   ghc-options: -Wall 
