diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+0.2.0.0
+----
+* Move `Config` API to typeclass `IConfig`
+* Add a `Setup.hs` file to every hachage repo (issue #5)
+* Add example of a project with a config spec embedded in the binary
+
 0.1.0.0
 ----
 * Add support for null values on Default (issue #3)
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/etc.cabal b/etc.cabal
--- a/etc.cabal
+++ b/etc.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           etc
-version:        0.1.0.0
+version:        0.2.0.0
 synopsis:       Declarative configuration spec for Haskell projects
 description:    Please see README.md
 category:       Configuration, System
diff --git a/src/System/Etc.hs b/src/System/Etc.hs
--- a/src/System/Etc.hs
+++ b/src/System/Etc.hs
@@ -10,6 +10,7 @@
   -- * Config
   -- $config
     Config
+  , IConfig
   , getConfigValue
   , getConfigValueWith
   , getSelectedConfigSource
@@ -60,7 +61,8 @@
   ) where
 
 import System.Etc.Internal.Resolver.Default (resolveDefault)
-import System.Etc.Internal.Types            (Config, ConfigSource (..), ConfigValue)
+import System.Etc.Internal.Types
+    (Config, ConfigSource (..), ConfigValue, IConfig (..))
 import System.Etc.Spec
     (ConfigSpec, ConfigurationError (..), parseConfigSpec, readConfigSpec)
 
@@ -83,8 +85,7 @@
     (hPrintPrettyConfig, printPrettyConfig, renderConfig)
 #endif
 
-import System.Etc.Internal.Config
-    (getAllConfigSources, getConfigValue, getConfigValueWith, getSelectedConfigSource)
+import System.Etc.Internal.Config ()
 import System.Etc.Internal.Resolver.Env  (resolveEnv, resolveEnvPure)
 import System.Etc.Internal.Resolver.File (resolveFiles)
 
diff --git a/src/System/Etc/Internal/Config.hs b/src/System/Etc/Internal/Config.hs
--- a/src/System/Etc/Internal/Config.hs
+++ b/src/System/Etc/Internal/Config.hs
@@ -1,3 +1,4 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 {-# OPTIONS_GHC -fno-warn-missing-signatures #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -9,6 +10,7 @@
 
 import qualified Data.Aeson          as JSON
 import qualified Data.Aeson.Internal as JSON (IResult (..), formatError, iparse)
+import qualified Data.Aeson.Types    as JSON (Parser)
 import qualified Data.HashMap.Strict as HashMap
 import qualified Data.Set            as Set
 import qualified Data.Text           as Text
@@ -36,14 +38,13 @@
           HashMap.empty
       & JSON.Object
 
--- Can't add signature given JSON.Parser is not exposed ¯\_(ツ)_/¯
--- getConfigValueWith
---   :: MonadThrow m
---   => (JSON.Value -> JSON.Parser value)
---   -> [Text]
---   -> Config
---   -> m value
-getConfigValueWith parser keys0 (Config configValue0) =
+_getConfigValueWith
+  :: MonadThrow m
+  => (JSON.Value -> JSON.Parser result)
+  -> [Text]
+  -> Config
+  -> m result
+_getConfigValueWith parser keys0 (Config configValue0) =
   let
     loop keys configValue =
       case (keys, configValue) of
@@ -89,12 +90,12 @@
   in
     loop keys0 configValue0
 
-getSelectedConfigSource
+_getSelectedConfigSource
   :: (MonadThrow m)
   => [Text]
   -> Config
   -> m ConfigSource
-getSelectedConfigSource keys0 (Config configValue0) =
+_getSelectedConfigSource keys0 (Config configValue0) =
   let
     loop keys configValue =
       case (keys, configValue) of
@@ -119,12 +120,12 @@
     loop keys0 configValue0
 
 
-getAllConfigSources
+_getAllConfigSources
   :: (MonadThrow m)
   => [Text]
   -> Config
   -> m (Set ConfigSource)
-getAllConfigSources keys0 (Config configValue0) =
+_getAllConfigSources keys0 (Config configValue0) =
   let
     loop keys configValue =
       case (keys, configValue) of
@@ -143,10 +144,17 @@
   in
     loop keys0 configValue0
 
-getConfigValue
+_getConfigValue
   :: (MonadThrow m, JSON.FromJSON result)
   => [Text]
   -> Config
   -> m result
-getConfigValue =
-  getConfigValueWith JSON.parseJSON
+_getConfigValue =
+  _getConfigValueWith JSON.parseJSON
+
+
+instance IConfig Config where
+  getConfigValue = _getConfigValue
+  getConfigValueWith = _getConfigValueWith
+  getAllConfigSources = _getAllConfigSources
+  getSelectedConfigSource = _getSelectedConfigSource
diff --git a/src/System/Etc/Internal/Types.hs b/src/System/Etc/Internal/Types.hs
--- a/src/System/Etc/Internal/Types.hs
+++ b/src/System/Etc/Internal/Types.hs
@@ -7,10 +7,12 @@
   , module System.Etc.Internal.Spec.Types
   ) where
 
+import Control.Monad.Catch (MonadThrow)
+import Data.HashMap.Strict (HashMap)
 import Protolude
 
 import qualified Data.Aeson          as JSON
-import           Data.HashMap.Strict (HashMap)
+import qualified Data.Aeson.Types    as JSON (Parser)
 import qualified Data.HashMap.Strict as HashMap
 import qualified Data.Set            as Set
 
@@ -138,3 +140,52 @@
           mvalue
     Nothing ->
       Nothing
+
+
+class IConfig config where
+  -- | Fetches a configuration value from a given key, if key
+  -- is not found, you may pick the failure mode via the 'MonadThrow'
+  -- interface.
+  --
+  -- example:
+  --
+  -- >>> getConfigValue ["db", "user"] config :: Maybe Text
+  -- Just "root"
+  -- >>> getConfigValue ["db", "password"] config :: Maybe Text
+  -- Nothing
+  getConfigValue
+    :: (MonadThrow m, JSON.FromJSON result)
+    => [Text]   -- ^ Key to fetch from config map
+    -> config   -- ^ Config record
+    -> m result
+  -- | Fetches a configuration value from a given key, normally this key will
+  -- point to a sub-config JSON object, which is then passed to the given JSON
+  -- parser function. If key is not found, you may pick the failure mode via the
+  -- 'MonadThrow' interface.
+  --
+  -- example:
+  --
+  -- >>> import qualified Data.Aeson as JSON
+  -- >>> import qualified Data.Aeson.Types as JSON (Parser)
+  --
+  -- >>> connectInfoParser :: JSON.Value -> JSON.Parser DbConnectInfo
+  --
+  -- >>> getConfigValueWith connectInfoParser ["db"] config
+  -- Just (DbConnectInfo {...})
+  --
+  getConfigValueWith
+    :: (MonadThrow m)
+    => (JSON.Value -> JSON.Parser result) -- ^ JSON Parser function
+    -> [Text]                             -- ^ Key to fetch from config map
+    -> config                             -- ^ Config record
+    -> m result
+  getAllConfigSources
+    :: (MonadThrow m)
+    => [Text]
+    -> config
+    -> m (Set ConfigSource)
+  getSelectedConfigSource
+    :: (MonadThrow m)
+    => [Text]
+    -> config
+    -> m ConfigSource
