diff --git a/logging-facade.cabal b/logging-facade.cabal
--- a/logging-facade.cabal
+++ b/logging-facade.cabal
@@ -1,7 +1,7 @@
 name:             logging-facade
-version:          0.0.0
-synopsis:         Simple logging abstraction that allows multiple backends
-description:      Simple logging abstraction that allows multiple backends
+version:          0.1.0
+synopsis:         Simple logging abstraction that allows multiple back-ends
+description:      Simple logging abstraction that allows multiple back-ends
 license:          MIT
 license-file:     LICENSE
 copyright:        (c) 2014 Simon Hengel
@@ -21,7 +21,6 @@
   exposed-modules:
       System.Logging.Facade
       System.Logging.Facade.Sink
-      System.Logging.Facade.TH
       System.Logging.Facade.Class
       System.Logging.Facade.Types
   build-depends:
diff --git a/src/System/Logging/Facade.hs b/src/System/Logging/Facade.hs
--- a/src/System/Logging/Facade.hs
+++ b/src/System/Logging/Facade.hs
@@ -1,3 +1,8 @@
+{-# LANGUAGE CPP #-}
+#if MIN_VERSION_base(4,8,1)
+#define HAS_SOURCE_LOCATIONS
+{-# LANGUAGE ImplicitParams #-}
+#endif
 -- |
 -- This module is intended to be imported qualified:
 --
@@ -21,26 +26,43 @@
 import           System.Logging.Facade.Types
 import           System.Logging.Facade.Class
 
+#ifdef HAS_SOURCE_LOCATIONS
+import           GHC.SrcLoc
+import           GHC.Stack
+#define with_loc (?loc :: CallStack) =>
+#else
+#define with_loc
+#endif
+
 -- | Produce a log message with specified log level.
-log :: Logging m => LogLevel -> String -> m ()
-log level message = consumeLogRecord (LogRecord level Nothing message)
+log :: with_loc Logging m => LogLevel -> String -> m ()
+log level message = consumeLogRecord (LogRecord level location message)
+  where
+    location :: Maybe Location
+#ifdef HAS_SOURCE_LOCATIONS
+    location = case reverse (getCallStack ?loc) of
+      (_, loc) : _ -> Just $ Location (srcLocPackage loc) (srcLocModule loc) (srcLocFile loc) (srcLocStartLine loc) (srcLocStartCol loc)
+      _ -> Nothing
+#else
+    location = Nothing
+#endif
 
 -- | Produce a log message with log level `TRACE`.
-trace :: Logging m => String -> m ()
+trace :: with_loc Logging m => String -> m ()
 trace = log TRACE
 
 -- | Produce a log message with log level `DEBUG`.
-debug :: Logging m => String -> m ()
+debug :: with_loc Logging m => String -> m ()
 debug = log DEBUG
 
 -- | Produce a log message with log level `INFO`.
-info :: Logging m => String -> m ()
+info :: with_loc Logging m => String -> m ()
 info = log INFO
 
 -- | Produce a log message with log level `WARN`.
-warn :: Logging m => String -> m ()
+warn :: with_loc Logging m => String -> m ()
 warn = log WARN
 
 -- | Produce a log message with log level `ERROR`.
-error :: Logging m => String -> m ()
+error :: with_loc Logging m => String -> m ()
 error = log ERROR
diff --git a/src/System/Logging/Facade/Class.hs b/src/System/Logging/Facade/Class.hs
--- a/src/System/Logging/Facade/Class.hs
+++ b/src/System/Logging/Facade/Class.hs
@@ -2,16 +2,15 @@
 {-# OPTIONS_GHC -fno-warn-deprecations #-} -- to suppress deprecation warning for ErrorT
 module System.Logging.Facade.Class where
 
-import           Data.Monoid
 import           Control.Monad.Trans.Class
 import           Control.Monad.Trans.Cont
 import           Control.Monad.Trans.Error
 import           Control.Monad.Trans.Identity
 import           Control.Monad.Trans.List
 import           Control.Monad.Trans.Maybe
-import           Control.Monad.Trans.Reader
 import           Control.Monad.Trans.RWS.Lazy
 import qualified Control.Monad.Trans.RWS.Strict as Strict
+import           Control.Monad.Trans.Reader
 import           Control.Monad.Trans.State.Lazy
 import qualified Control.Monad.Trans.State.Strict as Strict
 import           Control.Monad.Trans.Writer.Lazy
@@ -21,8 +20,12 @@
 import           Control.Monad.Trans.Except
 #endif
 
-import           System.Logging.Facade.Types
+#if !MIN_VERSION_base(4,8,0)
+import           Data.Monoid
+#endif
+
 import           System.Logging.Facade.Sink
+import           System.Logging.Facade.Types
 
 -- | A type class for monads with logging support
 class Monad m => Logging m where
diff --git a/src/System/Logging/Facade/TH.hs b/src/System/Logging/Facade/TH.hs
deleted file mode 100644
--- a/src/System/Logging/Facade/TH.hs
+++ /dev/null
@@ -1,79 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
--- |
--- This module is intended to be imported qualified:
---
--- > import qualified System.Logging.Facade.TH as Log
-module System.Logging.Facade.TH (
--- * Producing log messages
-  log
-, trace
-, debug
-, info
-, warn
-, error
-
--- * Types
-, Logging
-, LogLevel(..)
-) where
-
-import           Prelude hiding (mod, log, error)
-import           Language.Haskell.TH
-import           Language.Haskell.TH.Syntax
-
-import           System.Logging.Facade.Types
-import           System.Logging.Facade.Class
-
--- |
--- A Template Haskell version of `System.Logging.Facade.log` that adds a
--- source location to the produced log record.
-log :: ExpQ
-log = [|\level -> consumeLogRecord . LogRecord level $(mkLocation)|]
-
--- |
--- A Template Haskell version of `System.Logging.Facade.trace` that adds a
--- source location to the produced log record.
-trace :: ExpQ
-trace = [|$(log) TRACE|]
-
--- |
--- A Template Haskell version of `System.Logging.Facade.debug` that adds a
--- source location to the produced log record.
-debug :: ExpQ
-debug = [|$(log) DEBUG|]
-
--- |
--- A Template Haskell version of `System.Logging.Facade.info` that adds a
--- source location to the produced log record.
-info :: ExpQ
-info = [|$(log) INFO|]
-
--- |
--- A Template Haskell version of `System.Logging.Facade.warn` that adds a
--- source location to the produced log record.
-warn :: ExpQ
-warn = [|$(log) WARN|]
-
--- |
--- A Template Haskell version of `System.Logging.Facade.error` that adds a
--- source location to the produced log record.
-error :: ExpQ
-error = [|$(log) ERROR|]
-
-instance Lift LogLevel where
-  lift level = case level of
-    TRACE -> [|TRACE|]
-    DEBUG -> [|DEBUG|]
-    INFO -> [|INFO|]
-    WARN -> [|WARN|]
-    ERROR -> [|ERROR|]
-
-mkLocation :: ExpQ
-mkLocation = do
-  loc <- location
-  let file = loc_filename loc
-      package = loc_package loc
-      mod = loc_module loc
-      (line, column) = loc_start loc
-  [|Just (Location {locationPackage = package, locationModule = mod, locationFile = file, locationLine = line, locationColumn = column})|]
diff --git a/test/System/Logging/FacadeSpec.hs b/test/System/Logging/FacadeSpec.hs
--- a/test/System/Logging/FacadeSpec.hs
+++ b/test/System/Logging/FacadeSpec.hs
@@ -16,7 +16,7 @@
     it "writes a log message with log level INFO" $ do
       ref <- newIORef []
       let captureLogMessage :: LogSink
-          captureLogMessage record = modifyIORef ref (record :)
+          captureLogMessage record = modifyIORef ref (record {logRecordLocation = Nothing} :)
       setLogSink captureLogMessage
       info "some log message"
       readIORef ref `shouldReturn` [LogRecord INFO Nothing "some log message"]
