diff --git a/Data/JSON/Types.hs b/Data/JSON/Types.hs
new file mode 100644
--- /dev/null
+++ b/Data/JSON/Types.hs
@@ -0,0 +1,89 @@
+-- Copyright (c) 2010 John Millikin
+--
+-- Permission is hereby granted, free of charge, to any person
+-- obtaining a copy of this software and associated documentation
+-- files (the "Software"), to deal in the Software without
+-- restriction, including without limitation the rights to use,
+-- copy, modify, merge, publish, distribute, sublicense, and/or sell
+-- copies of the Software, and to permit persons to whom the
+-- Software is furnished to do so, subject to the following
+-- conditions:
+--
+-- The above copyright notice and this permission notice shall be
+-- included in all copies or substantial portions of the Software.
+--
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+-- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+-- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+-- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+-- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+-- OTHER DEALINGS IN THE SOFTWARE.
+
+module Data.JSON.Types
+	( -- * DOM-based
+	  Root (..)
+	, Object
+	, Array
+	, Value (..)
+	, Atom (..)
+	
+	-- * Event-based
+	, Event (..)
+	) where
+import Data.Map (Map)
+import Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy as T
+import Data.String (IsString, fromString)
+
+-- | Each JSON document has a single /root/, which may be either an 'Object'
+-- or 'Array'.
+--
+-- Some parsers allow non-container roots, but portable libraries should
+-- not depend on this incorrect behavior.
+data Root
+	= RootObject Object
+	| RootArray Array
+	deriving (Show, Eq)
+
+-- | Objects store unordered associations between textual keys and 'Value's.
+type Object = Map Text Value
+
+-- | Arrays are ordered sequences of 'Value's.
+type Array = [Value]
+
+data Value
+	= ValueObject Object
+	| ValueArray Array
+	| ValueAtom Atom
+	deriving (Show, Eq)
+
+instance IsString Value where
+	fromString = ValueAtom . fromString
+
+data Atom
+	= AtomNull
+	| AtomBoolean Bool
+	
+	-- | JSON numbers may be of arbitrary length and precision. Using
+	-- 'Rational' allows any valid parsed number to be stored; however,
+	-- note that only rationals with a finite decimal expansion can be
+	-- fully serialized. For example, attempting to serialize @(1 % 3)@
+	-- will lose precision.
+	| AtomNumber Rational
+	
+	| AtomText Text
+	deriving (Show, Eq)
+
+instance IsString Atom where
+	fromString = AtomText . T.pack
+
+data Event
+	= EventBeginObject
+	| EventEndObject
+	| EventBeginArray
+	| EventEndArray
+	| EventAttributeName Text
+	| EventAtom Atom
+	deriving (Show, Eq)
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/json-types.cabal b/json-types.cabal
new file mode 100644
--- /dev/null
+++ b/json-types.cabal
@@ -0,0 +1,27 @@
+name: json-types
+version: 0.1
+synopsis: Basic types for representing JSON
+license: MIT
+license-file: license.txt
+author: John Millikin <jmillikin@gmail.com>
+maintainer: jmillikin@gmail.com
+build-type: Simple
+cabal-version: >=1.6
+category: Text, JSON
+stability: experimental
+bug-reports: mailto:jmillikin@gmail.com
+
+source-repository head
+  type: bazaar
+  location: http://john-millikin.com/software/json-types/
+
+library
+  ghc-options: -Wall
+
+  build-depends:
+      base >= 3 && < 5
+    , text
+    , containers
+
+  exposed-modules:
+    Data.JSON.Types
diff --git a/license.txt b/license.txt
new file mode 100644
--- /dev/null
+++ b/license.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2010 John Millikin
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
