diff --git a/Data/Symbol.hs b/Data/Symbol.hs
new file mode 100644
--- /dev/null
+++ b/Data/Symbol.hs
@@ -0,0 +1,98 @@
+-- Copyright (c) 2009-2010
+--         The President and Fellows of Harvard College.
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+-- 1. Redistributions of source code must retain the above copyright
+--    notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above copyright
+--    notice, this list of conditions and the following disclaimer in the
+--    documentation and/or other materials provided with the distribution.
+-- 3. Neither the name of the University nor the names of its contributors
+--    may be used to endorse or promote products derived from this software
+--    without specific prior written permission.
+
+-- THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
+-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+-- ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
+-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+-- SUCH DAMAGE.
+
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Data.Symbol
+-- Copyright   :  (c) Harvard University 2009-2010
+-- License     :  BSD-style
+-- Maintainer  :  mainland@eecs.harvard.edu
+--
+--------------------------------------------------------------------------------
+
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+
+module Data.Symbol (
+    Symbol(..),
+    intern,
+    unintern
+  ) where
+
+import Control.Concurrent.MVar
+import Data.Generics (Data, Typeable)
+#if __GLASGOW_HASKELL__ >= 608
+import Data.String
+#endif /* __GLASGOW_HASKELL__ >= 608 */
+import qualified Data.Map as Map
+import System.IO.Unsafe (unsafePerformIO)
+
+data Symbol =  -- | Unique identifier and the string itself
+               Symbol {-# UNPACK #-} !Int !String
+#if defined(__GLASGOW_HASKELL__)
+  deriving (Data, Typeable)
+#endif /* defined(__GLASGOW_HASKELL__) */
+
+instance Eq Symbol where
+    (Symbol i1 _) == (Symbol i2 _) = i1 == i2
+
+instance Ord Symbol where
+    compare (Symbol i1 _) (Symbol i2 _) = compare i1 i2
+
+#if __GLASGOW_HASKELL__ >= 608
+instance IsString Symbol where
+    fromString = intern
+#endif /* __GLASGOW_HASKELL__ >= 608 */
+
+data SymbolEnv = SymbolEnv
+    { uniq    :: {-# UNPACK #-} !Int
+    , symbols :: !(Map.Map String Symbol)
+    }
+
+symbolEnv :: MVar SymbolEnv
+symbolEnv = unsafePerformIO $ newMVar $ SymbolEnv 1 Map.empty
+
+-- We @seq@ @s@ so that we can guarantee that when we perform the lookup we
+-- won't potentially have to evaluate a thunk that might itself call @intern@,
+-- leading to a deadlock.
+
+-- |Intern a string to produce a 'Symbol'.
+{-# NOINLINE intern #-}
+intern :: String -> Symbol
+intern s = s `seq` unsafePerformIO $ modifyMVar symbolEnv $ \env -> do
+    case Map.lookup s (symbols env) of
+      Nothing  -> do let sym  = Symbol (uniq env) s
+                     let env' = env { uniq    = uniq env + 1,
+                                      symbols = Map.insert s sym
+                                                (symbols env)
+                                    }
+                     env' `seq` return (env', sym)
+      Just sym -> return (env, sym)
+
+-- |Return the 'String' associated with a 'Symbol'.
+unintern :: Symbol -> String
+unintern (Symbol _ s) = s
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2006-2010
+        The President and Fellows of Harvard College.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,3 @@
+import Distribution.Simple
+
+main = defaultMain
diff --git a/symbol.cabal b/symbol.cabal
new file mode 100644
--- /dev/null
+++ b/symbol.cabal
@@ -0,0 +1,30 @@
+name:           symbol
+version:        0.1
+cabal-version:  >= 1.6
+license:        BSD3
+license-file:   LICENSE
+copyright:      (c) 2006-2010 Harvard University
+author:         Geoffrey Mainland <mainland@eecs.harvard.edu>
+maintainer:     mainland@eecs.harvard.edu
+stability:      alpha
+homepage:       http://www.eecs.harvard.edu/~mainland/
+category:       Data
+synopsis:       A 'Symbol' type for fast symbol comparison.
+description:    Provides a 'Symbol' data type allowing fast symbol comparisons
+		and functions for interning symbols and recovering their
+		'String' representation.
+
+build-type:     Simple
+
+library
+  exposed-modules:
+    Data.Symbol
+
+  build-depends:
+    base >= 4 && < 5,
+    containers >= 0.2 && < 0.4,
+    syb >= 0.1 && < 0.2
+
+source-repository head
+  type:     svn
+  location: http://senseless.eecs.harvard.edu/repos/mainland-projects/symbol/trunk/
