diff --git a/Data/Default.hs b/Data/Default.hs
new file mode 100644
--- /dev/null
+++ b/Data/Default.hs
@@ -0,0 +1,32 @@
+module Data.Default (
+-- | This module defines a class for types with a default value. Instances are
+-- provided for '()', 'S.Set', 'M.Map', 'Int', 'Integer', 'Float', 'Double',
+-- 'Ratio', 'Maybe', '[]', '->' and 'IO'.
+    Default(..)
+) where
+
+import Data.Ratio
+import qualified Data.Set as S
+import qualified Data.Map as M
+
+-- | A class for types with a default value.
+class Default a where
+    -- | The default value for this type.
+    def :: a
+
+instance Default () where def = ()
+
+instance Default (S.Set v) where def = S.empty
+instance Default (M.Map k v) where def = M.empty
+
+instance Default Int where def = 0
+instance Default Integer where def = 0
+instance Default Float where def = 0
+instance Default Double where def = 0
+instance (Integral a) => Default (Ratio a) where def = 0
+
+instance Default (Maybe a) where def = Nothing
+instance Default [a] where def = []
+
+instance (Default r) => Default (e -> r) where def _ = def
+instance (Default a) => Default (IO a) where def = return def
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,4 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main :: IO ()
+> main = defaultMain
diff --git a/data-default.cabal b/data-default.cabal
new file mode 100644
--- /dev/null
+++ b/data-default.cabal
@@ -0,0 +1,14 @@
+Name:            data-default
+Version:         0.2
+Cabal-Version:   >= 1.2
+Category:        Data
+Synopsis:        A class for types with a default value
+Build-Type:      Simple
+License:         BSD3
+Author:          Lukas Mai
+Maintainer:      <l.mai@web.de>
+
+Library
+  Build-Depends:     base, containers
+  Exposed-Modules:   Data.Default
+  Ghc-Options:       -Wall -O2
