diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,1 @@
+BSD3
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/Type/Ord.hs b/Type/Ord.hs
new file mode 100644
--- /dev/null
+++ b/Type/Ord.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE EmptyDataDecls, QuasiQuotes, TypeFamilies, UndecidableInstances,
+  TemplateHaskell #-}
+
+{- |
+
+Module      :  Type.Ord
+Copyright   :  (c) The University of Kansas 2011
+License     :  BSD3
+
+Maintainer  :  nicolas.frisby@gmail.com
+Stability   :  experimental
+Portability :  see LANGUAGE pragmas (... GHC)
+
+Type-level comparison operator, its result \"kind\", and that kind's case
+expression. Plus instances for @()@-terminated @type-digits@ numerals.
+
+-}
+module Type.Ord (module Type.Ord.Base) where
+
+import Type.Digits (digit, radix)
+
+import Type.Ord.Base
+
+import Language.Haskell.TH
+
+
+
+type instance Compare () () = EQ
+fmap concat $ sequence [ do
+  let dL = conT $ digit n
+      [l, r] = map (varT . mkName) ["l", "r"]
+      f x y z = tySynInstD ''Compare [x, y] z
+  d <- f [t| $dL $l |] [t| $dL $r |] [t| Compare $l $r |]
+  ((d:) . concat) `fmap` sequence [
+    let dR = conT $ digit m in
+    sequence [f [t| $dL $l |] [t| $dR $r |] [t| LT |],
+              f [t| $dR $l |] [t| $dL $r |] [t| GT |]]
+    | m <- [n + 1..radix - 1] ]
+  | n <- [0..radix - 1] ]
diff --git a/Type/Ord/Base.hs b/Type/Ord/Base.hs
new file mode 100644
--- /dev/null
+++ b/Type/Ord/Base.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE TypeFamilies, EmptyDataDecls #-}
+
+{- |
+
+Module      :  Type.Ord.Base
+Copyright   :  (c) The University of Kansas 2011
+License     :  BSD3
+
+Maintainer  :  nicolas.frisby@gmail.com
+Stability   :  experimental
+Portability :  see LANGUAGE pragmas (... GHC)
+
+Type-level comparison operator, its result \"kind\", and that kind's case
+expression.
+
+-}
+module Type.Ord.Base
+  (module Type.Booleans, Compare, LT, EQ, GT, OrdCase, IsEQ, IsLT, IsGT) where
+
+import Type.Booleans (True, False)
+
+
+
+-- | Type-level comparison.
+type family Compare l r
+
+data LT; data EQ; data GT
+
+-- | @OrdCase x a b c@ reduces to @a@, @b@, or @c@, if @x@ is @LT@, @EQ@, or
+-- @GT@, respectively.
+type OrdCase x a b c = OrdCase_ x a b c
+type family OrdCase_ x a b c
+type instance OrdCase_ LT a b c = a
+type instance OrdCase_ EQ a b c = b
+type instance OrdCase_ GT a b c = c
+
+
+
+type IsEQ t = OrdCase t False True False
+type IsLT t = OrdCase t True False False
+type IsGT t = OrdCase t False False True
diff --git a/type-ord.cabal b/type-ord.cabal
new file mode 100644
--- /dev/null
+++ b/type-ord.cabal
@@ -0,0 +1,25 @@
+Name:           type-ord
+Version:        0.1
+License:        BSD3
+License-File:   LICENSE
+Author:         Nicolas Frisby <nicolas.frisby@gmail.com>
+Maintainer:     Nicolas Frisby <nicolas.frisby@gmail.com>
+
+Category: Type System
+
+Synopsis:       Type-level comparison operator
+
+Description: Type-level comparison operator with instances for ()-terminated
+  @type-digit@ numerals until <http://hackage.haskell.org/trac/ghc/ticket/1894>
+  is resolved.
+
+Cabal-Version: >= 1.6.0.1
+
+Build-Type: Simple
+
+
+Library
+  Build-Depends: base >= 4 && < 5, template-haskell
+  Build-Depends: type-booleans < 0.2, type-spine < 0.2, type-digits < 0.2
+
+  Exposed-Modules: Type.Ord, Type.Ord.Base
