diff --git a/Data/Tuple/OneTuple.hs b/Data/Tuple/OneTuple.hs
new file mode 100644
--- /dev/null
+++ b/Data/Tuple/OneTuple.hs
@@ -0,0 +1,73 @@
+
+-- |OneTuple fills the /tuple gap/ with a singleton tuple.
+-- 
+-- OneTuple /does not support/ the usual parenthesized tuple syntax.
+-- 
+-- OneTuple
+--
+--   * has the expected laziness properties
+--
+--   * can be pattern-matched
+--
+--   * ships with instances for several standard type classes,
+--     including all those supported by H98-standard tuples
+--
+--   * requires no language extensions, except for hierarchical modules
+
+module Data.Tuple.OneTuple (OneTuple(OneTuple), only) where
+
+import Control.Applicative
+import Control.Monad
+import Data.Foldable
+import Data.Ix
+import Data.Monoid
+import Data.Traversable
+
+-- |OneTuple is the singleton tuple data type.
+data OneTuple a
+    = OneTuple a  -- ^ singleton tuple constructor
+    deriving (Eq,Ord,Bounded,Show,Read)
+
+-- |The 'only' function extracts the OneTuple's only member.
+-- (Compare to 'fst' and 'snd'.)
+only :: OneTuple a -- ^ takes a singleton tuple argument
+     -> a          -- ^ returns the only element in the tuple
+only (OneTuple x) = x
+
+instance (Enum a) => Enum (OneTuple a) where
+    succ = liftA succ
+    pred = liftA pred
+    toEnum = pure . toEnum
+    fromEnum (OneTuple x) = fromEnum x
+
+instance (Ix a) => Ix (OneTuple a) where
+    range   (OneTuple x, OneTuple y) = map OneTuple (range (x,y))
+    index   (OneTuple x, OneTuple y) (OneTuple z) = index   (x,y) z
+    inRange (OneTuple x, OneTuple y) (OneTuple z) = inRange (x,y) z
+
+instance Foldable OneTuple where
+    fold (OneTuple m) = m
+    foldMap f (OneTuple x) = f x
+    foldr f b (OneTuple x) = f x b
+    foldl f a (OneTuple x) = f a x
+    foldr1 _f (OneTuple x) = x
+    foldl1 _f (OneTuple x) = x
+
+instance Traversable OneTuple
+
+instance Functor OneTuple where
+    fmap f (OneTuple x) = OneTuple (f x)
+
+instance Applicative OneTuple where
+    pure = return
+    (<*>) = ap
+
+instance Monad OneTuple where
+    (OneTuple x) >>= f = f x
+    return = OneTuple
+
+instance (Monoid a) => Monoid (OneTuple a) where
+    mempty = OneTuple mempty
+    mappend (OneTuple x) (OneTuple y) = OneTuple (mappend x y)
+    mconcat = Prelude.foldr1 mappend
+
diff --git a/FAQ b/FAQ
new file mode 100644
--- /dev/null
+++ b/FAQ
@@ -0,0 +1,27 @@
+
+This is a list of Frequently Asked Questions about OneTuple, the
+optional Haskell singleton tuple type.
+
+Some of these are, of course, merely anticipated FAQs.
+
+Q 1.  What's the point, if you can't support the same syntax as
+      'normal' tuples?
+A 1.  You can hack it up in TH if you want -- patches are welcome!
+      Simplicity and (near) H98 compatibility were goals in building
+      OneTuple.
+
+Q 2.  Why define 'data OneTuple' instead of just a type alias?
+A 2.  For laziness and pattern matching similar to other tuples.
+
+Q 3.  Isn't this the same as <something> ?
+A 3.  Could be, but this one's sold as a tuple!
+
+Q 4.  Singleton tuples don't make sense!  They're isomorphic to their
+      component type!
+A 4.  Yes, that's true, up to laziness.
+
+Q 5.  What's NST?
+A 5.  "Need Singleton Tuple".  It's the class of problems that can't
+      be solved without using a singleton tuple.  Also conveniently
+      stands for "No Such Thing".
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,34 @@
+
+Copyright (c) 2008, John A. Dorsey.
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* 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.
+
+* Neither the name of John Dorsey 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 COPYRIGHT HOLDERS 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 COPYRIGHT
+OWNER 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/OneTuple.cabal b/OneTuple.cabal
new file mode 100644
--- /dev/null
+++ b/OneTuple.cabal
@@ -0,0 +1,15 @@
+Name:            OneTuple
+Version:         0.1.0
+Synopsis:        OneTuple, the Singleton Tuple
+Description:     OneTuple, the Singleton Tuple
+Copyright:       (c) John Dorsey 2008
+License:	 BSD3
+License-file:    LICENSE
+Author:          John Dorsey <haskell@colquitt.org>
+Maintainer:      John Dorsey <haskell@colquitt.org>
+Cabal-version:   > 1.4
+Stability:       experimental
+Build-type:      Simple
+Build-depends:   base
+Exposed-Modules: Data.Tuple.OneTuple
+
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,4 @@
+ 
+import Distribution.Simple
+main = defaultMain
+
