diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,21 @@
+## 3.0.0
+
+* Allowing the callback logger to be generic. [#182](https://github.com/kazu-yamamoto/logger/pull/180) This is a BREAKING CHANGE. Users should do:
+  1. Importing `LogType'` and related constructors because `LogType` is now a type alias.
+  2. Using `{-# LANGUAGE GADTs #-}`, even if you aren't using anything new, any time you try and `case` over values of type `LogType'`.
+
+## 2.4.17
+
+* Obtaining a fresh fd from IORef just before writing. [#180](https://github.com/kazu-yamamoto/logger/pull/180)
+
+## 2.4.16
+
+* Using strict language extensions.
+
+## 2.4.15
+
+* Rescuing GHC 7.8.
+	
 ## 2.4.14
 
 * Add `ToLogStr` instances for the following types: signed integers, unsigned integers, floating-point numbers. These instances all use decimal encodings. [#177](https://github.com/kazu-yamamoto/logger/pull/177)
diff --git a/System/Log/FastLogger.hs b/System/Log/FastLogger.hs
--- a/System/Log/FastLogger.hs
+++ b/System/Log/FastLogger.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE GADTs             #-}
 
 -- | This module provides a fast logging system which
 --   scales on multicore environments (i.e. +RTS -N\<x\>).
@@ -34,7 +35,7 @@
   -- * FastLogger
   , FastLogger
   , TimedFastLogger
-  , LogType(..)
+  , LogType'(..), LogType
   , newFastLogger
   , withFastLogger
   , newTimedFastLogger
@@ -183,34 +184,39 @@
 -- @
 type TimedFastLogger = (FormattedTime -> LogStr) -> IO ()
 
+type LogType = LogType' LogStr
+
 -- | Logger Type.
-data LogType
-    = LogNone                     -- ^ No logging.
-    | LogStdout BufSize           -- ^ Logging to stdout.
+data LogType' a where
+    LogNone :: LogType' LogStr    -- ^ No logging.
+    LogStdout :: BufSize -> LogType' LogStr
+                                  -- ^ Logging to stdout.
                                   --   'BufSize' is a buffer size
                                   --   for each capability.
-    | LogStderr BufSize           -- ^ Logging to stderr.
+    LogStderr :: BufSize -> LogType' LogStr
+                                  -- ^ Logging to stderr.
                                   --   'BufSize' is a buffer size
                                   --   for each capability.
-    | LogFileNoRotate FilePath BufSize
+    LogFileNoRotate :: FilePath -> BufSize -> LogType' LogStr
                                   -- ^ Logging to a file.
                                   --   'BufSize' is a buffer size
                                   --   for each capability.
-    | LogFile FileLogSpec BufSize -- ^ Logging to a file.
+    LogFile :: FileLogSpec -> BufSize -> LogType' LogStr
+                                  -- ^ Logging to a file.
                                   --   'BufSize' is a buffer size
                                   --   for each capability.
                                   --   File rotation is done on-demand.
-    | LogFileTimedRotate TimedFileLogSpec BufSize -- ^ Logging to a file.
+    LogFileTimedRotate :: TimedFileLogSpec -> BufSize -> LogType' LogStr -- ^ Logging to a file.
                                   --   'BufSize' is a buffer size
                                   --   for each capability.
                                   --   Rotation happens based on check specified
                                   --   in 'TimedFileLogSpec'.
-    | LogCallback (LogStr -> IO ()) (IO ()) -- ^ Logging with a log and flush action.
-                                               -- run flush after log each message.
+    LogCallback :: (v -> IO ()) -> IO () -> LogType' v  -- ^ Logging with a log and flush action.
+                                                          -- run flush after log each message.
 
 -- | Initialize a 'FastLogger' without attaching timestamp
 -- a tuple of logger and clean up action are returned.
-newFastLogger :: LogType -> IO (FastLogger, IO ())
+newFastLogger :: LogType' v -> IO (v -> IO (), IO ())
 newFastLogger typ = case typ of
     LogNone                        -> return (const noOp, noOp)
     LogStdout bsize                -> newStdoutLoggerSet bsize >>= stdLoggerInit
diff --git a/fast-logger.cabal b/fast-logger.cabal
--- a/fast-logger.cabal
+++ b/fast-logger.cabal
@@ -1,5 +1,5 @@
 Name:                   fast-logger
-Version:                2.4.17
+Version:                3.0.0
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -25,7 +25,7 @@
                         System.Log.FastLogger.FileIO
                         System.Log.FastLogger.LogStr
                         System.Log.FastLogger.Logger
-  Build-Depends:        base >= 4.5 && < 5
+  Build-Depends:        base >= 4.7 && < 5
                       , array
                       , auto-update >= 0.1.2
                       , easy-file >= 0.2
