diff --git a/conferer-snap.cabal b/conferer-snap.cabal
--- a/conferer-snap.cabal
+++ b/conferer-snap.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: c3fb3465cdfcdbd877ac1a90998917be21c2be3174c9e635942c41abe78ea795
+-- hash: a9417ee6e2d363834a082603cf8246196ad028d600b5f5d544451b6fe8d0b838
 
 name:           conferer-snap
-version:        0.2.0.0
+version:        0.3.0.0
 synopsis:       conferer's FromConfig instances for snap Config
 
 description:    Library to abstract the parsing of many haskell config values from different config sources
@@ -25,7 +25,7 @@
 
 library
   exposed-modules:
-      Conferer.FetchFromConfig.Snap
+      Conferer.FromConfig.Snap
   other-modules:
       Paths_conferer_snap
   hs-source-dirs:
@@ -33,13 +33,13 @@
   default-extensions: OverloadedStrings LambdaCase QuasiQuotes ScopedTypeVariables
   build-depends:
       base >=4.3 && <5
-    , conferer >=0.2.0.0 && <0.3.0.0
+    , conferer >=0.3.0.0 && <0.4.0.0
     , snap-core >=1.0 && <2.0
     , snap-server >=1.0 && <2.0
     , text >=1.1 && <1.3
   default-language: Haskell2010
 
-test-suite conferer-snap-test
+test-suite specs
   type: exitcode-stdio-1.0
   main-is: Spec.hs
   other-modules:
@@ -49,7 +49,7 @@
   default-extensions: OverloadedStrings LambdaCase QuasiQuotes ScopedTypeVariables
   build-depends:
       base >=4.3 && <5
-    , conferer >=0.2.0.0 && <0.3.0.0
+    , conferer >=0.3.0.0 && <0.4.0.0
     , conferer-snap
     , hspec
     , snap-core >=1.0 && <2.0
diff --git a/src/Conferer/FetchFromConfig/Snap.hs b/src/Conferer/FetchFromConfig/Snap.hs
deleted file mode 100644
--- a/src/Conferer/FetchFromConfig/Snap.hs
+++ /dev/null
@@ -1,63 +0,0 @@
-module Conferer.FetchFromConfig.Snap
-  (
-  -- * How to use this
-  -- | FetchFromConfig instance for snap server configuration
-  --
-  -- @
-  -- import Conferer
-  -- import Conferer.FetchFromConfig.Snap ()
-  --
-  -- main = do
-  --   config <- 'defaultConfig' \"awesomeapp\"
-  --   snapConfig <- 'getFromConfig' \"snap\" config
-  -- @
-  --
-  -- * Internal utility functions
-  -- | These may be useful for someone but are subject to change at any point so
-  -- use with care
-  ) where
-
-import Conferer.Core
-import Conferer.Types
-import Conferer.FetchFromConfig.Basics
-
-import Data.Either (rights)
-import Data.String (fromString)
-import Data.Text (Text, unpack)
-
-import qualified Snap.Http.Server.Config as Snap
-import qualified Snap.Core as Snap
-
-instance FetchFromConfig Snap.ConfigLog where
-  fetch k config = do
-    getKey k config
-      >>= \case
-        Just "NoLog" -> return $ Just $ Snap.ConfigNoLog
-        Just t -> return $ Just $ Snap.ConfigFileLog $ unpack t
-        Nothing -> return $ Nothing
-
-instance (Snap.MonadSnap m) => DefaultConfig (Snap.Config m a) where
-  configDef = Snap.defaultConfig
-
-instance (FetchFromConfig a, Snap.MonadSnap m) => FetchFromConfig (Snap.Config m a) where
-  fetch k config = do
-    pure (configDef)
-      >>= findKeyAndApplyConfig config k "default-timeout" Snap.setDefaultTimeout
-      >>= findKeyAndApplyConfig config k "access-log" Snap.setAccessLog
-      >>= findKeyAndApplyConfig config k "bind" Snap.setBind
-      >>= findKeyAndApplyConfig config k "compression" Snap.setCompression
-      >>= findKeyAndApplyConfig config k "error-log" Snap.setErrorLog
-      >>= findKeyAndApplyConfig config k "hostname" Snap.setHostname
-      >>= findKeyAndApplyConfig config k "locale" Snap.setLocale
-      >>= findKeyAndApplyConfig config k "other" Snap.setOther
-      >>= findKeyAndApplyConfig config k "port" Snap.setPort
-      -- >>= findKeyAndApplyConfig config k "proxy-type" Snap.setProxyType
-      >>= findKeyAndApplyConfig config k "ssl-bind" Snap.setSSLBind
-      >>= findKeyAndApplyConfig config k "ssl-cert" Snap.setSSLCert
-      >>= findKeyAndApplyConfig config k "ssl-key" Snap.setSSLKey
-      >>= findKeyAndApplyConfig config k "ssl-chain-cert" Snap.setSSLChainCert
-      >>= findKeyAndApplyConfig config k "ssl-port" Snap.setSSLPort
-      >>= findKeyAndApplyConfig config k "verbose" Snap.setVerbose
-      >>= findKeyAndApplyConfig config k "unix-socket" Snap.setUnixSocket
-      >>= findKeyAndApplyConfig config k "unix-socket-access-mode" Snap.setUnixSocketAccessMode
-      >>= (return . return)
diff --git a/src/Conferer/FromConfig/Snap.hs b/src/Conferer/FromConfig/Snap.hs
new file mode 100644
--- /dev/null
+++ b/src/Conferer/FromConfig/Snap.hs
@@ -0,0 +1,69 @@
+module Conferer.FromConfig.Snap
+  (
+  -- * How to use this
+  -- | FromConfig instance for snap server configuration
+  --
+  -- @
+  -- import Conferer
+  -- import Conferer.FromConfig.Snap ()
+  --
+  -- main = do
+  --   config <- 'defaultConfig' \"awesomeapp\"
+  --   snapConfig <- 'getFromConfig' \"snap\" config
+  -- @
+  --
+  -- * Internal utility functions
+  -- | These may be useful for someone but are subject to change at any point so
+  -- use with care
+  ) where
+
+import Conferer.Core
+import Conferer.Types
+import Conferer.FromConfig.Basics
+
+import Data.Either (rights)
+import Data.String (fromString)
+import Data.Text (Text, unpack)
+import Data.Typeable
+
+import qualified Snap.Http.Server.Config as Snap
+import qualified Snap.Core as Snap
+
+instance FromConfig Snap.ConfigLog where
+  updateFromConfig = updateAllAtOnceUsingFetch
+  fetchFromConfig k config = do
+    getKey k config
+      >>= \case
+        Just "NoLog" -> return $ Just $ Snap.ConfigNoLog
+        Just t -> return $ Just $ Snap.ConfigFileLog $ unpack t
+        Nothing -> return $ Nothing
+
+instance (Snap.MonadSnap m, DefaultConfig a) => DefaultConfig (Snap.Config m a) where
+  configDef = Snap.defaultConfig
+
+withMaybe f (Just a) c = f a c
+withMaybe f (Nothing) c = c
+
+instance forall a m. (Typeable m, FromConfig a, Snap.MonadSnap m) => FromConfig (Snap.Config m a) where
+  fetchFromConfig k config = return Nothing
+  updateFromConfig k config snapConfig = do
+    pure snapConfig
+      >>= findKeyAndApplyConfig config k "defaultTimeout" Snap.getDefaultTimeout (withMaybe Snap.setDefaultTimeout)
+      >>= findKeyAndApplyConfig config k "accessLog" Snap.getAccessLog (withMaybe Snap.setAccessLog)
+      >>= findKeyAndApplyConfig config k "bind" Snap.getBind (withMaybe Snap.setBind)
+      >>= findKeyAndApplyConfig config k "compression" Snap.getCompression (withMaybe Snap.setCompression)
+      >>= findKeyAndApplyConfig config k "errorLog" Snap.getErrorLog (withMaybe Snap.setErrorLog)
+      >>= findKeyAndApplyConfig config k "hostname" Snap.getHostname (withMaybe Snap.setHostname)
+      >>= findKeyAndApplyConfig config k "locale" Snap.getLocale (withMaybe Snap.setLocale)
+      >>= findKeyAndApplyConfig config k "port" Snap.getPort (withMaybe Snap.setPort)
+      -- >>= findKeyAndApplyConfig config k "proxy-type" (withMaybe Snap.setProxyType)
+      >>= findKeyAndApplyConfig config k "sslBind" Snap.getSSLBind (withMaybe Snap.setSSLBind)
+      >>= findKeyAndApplyConfig config k "sslCert" Snap.getSSLCert (withMaybe Snap.setSSLCert)
+      >>= findKeyAndApplyConfig config k "sslKey" Snap.getSSLKey (withMaybe Snap.setSSLKey)
+      >>= findKeyAndApplyConfig config k "sslChain-cert" Snap.getSSLChainCert (withMaybe Snap.setSSLChainCert)
+      >>= findKeyAndApplyConfig config k "sslPort" Snap.getSSLPort (withMaybe Snap.setSSLPort)
+      >>= findKeyAndApplyConfig config k "verbose" Snap.getVerbose (withMaybe Snap.setVerbose)
+      >>= findKeyAndApplyConfig config k "unixSocket" Snap.getUnixSocket (withMaybe Snap.setUnixSocket)
+      >>= findKeyAndApplyConfig config k "unixSocketAccessMode" Snap.getUnixSocketAccessMode (withMaybe Snap.setUnixSocketAccessMode)
+      >>= findKeyAndApplyConfig config k "other" Snap.getOther (withMaybe Snap.setOther)
+      >>= return
