diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for blucontrol
 
+## 0.4.1.0 *08 Jun 2021*
+
+* Remove field `coerceValue` from `ConfigControl`.
+* Add `CompatibleValues` class.
+
 ## 0.4.0.0 *06 Jun 2021*
 
 * Remove `RGB` class.
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -8,7 +8,6 @@
 import Blucontrol.Control.Wait
 import Blucontrol.Gamma.Linear
 import Blucontrol.Recolor.X
-import Blucontrol.RGB
 import Blucontrol.RGB.Temperature
 
 main :: IO ()
@@ -16,7 +15,6 @@
   where configControl = ConfigControl { runControl = runControlPrintT !> runControlCountT def !> runControlWaitT def
                                       , runGamma = runGammaLinearT @Temperature rgbMap
                                       , runRecolor = runRecolorXTIO def
-                                      , coerceValue = mapRGB word8ToFloat . toRGBWord8
                                       }
         rgbMap = 00:.00 ==> 4000
             :| [ 08:.00 ==> 4600
diff --git a/blucontrol.cabal b/blucontrol.cabal
--- a/blucontrol.cabal
+++ b/blucontrol.cabal
@@ -1,5 +1,5 @@
 name:                blucontrol
-version:             0.4.0.0
+version:             0.4.1.0
 synopsis:            Configurable blue light filter
 description:         This application is a blue light filter, with the main focus on
                      configurability.
@@ -25,6 +25,7 @@
 
 library
   exposed-modules:     Blucontrol
+                       Blucontrol.CompatibleValues
                        Blucontrol.Control
                        Blucontrol.Control.Concat
                        Blucontrol.Control.Count
diff --git a/src/Blucontrol/CompatibleValues.hs b/src/Blucontrol/CompatibleValues.hs
new file mode 100644
--- /dev/null
+++ b/src/Blucontrol/CompatibleValues.hs
@@ -0,0 +1,9 @@
+module Blucontrol.CompatibleValues (
+  CompatibleValues (..)
+) where
+
+class CompatibleValues a b where
+    convertValue :: a -> b
+
+instance CompatibleValues a a where
+  convertValue = id
diff --git a/src/Blucontrol/Main.hs b/src/Blucontrol/Main.hs
--- a/src/Blucontrol/Main.hs
+++ b/src/Blucontrol/Main.hs
@@ -6,6 +6,7 @@
 
 import Control.Monad.Trans.Control
 
+import Blucontrol.CompatibleValues
 import Blucontrol.Main.Control
 import Blucontrol.Main.CLI
 import Blucontrol.Control
@@ -19,16 +20,16 @@
   , MonadBaseControl IO r
   , MonadGamma g
   , MonadRecolor r
+  , CompatibleValues (GammaValue g) (RecolorValue r)
   )
 
 blucontrol :: BlucontrolConstraints m g r
            => ConfigControl m g r
            -> IO ()
 blucontrol c = do launch
-                  runControl c $ loopRecolor (runGamma c) (runRecolor c) (coerceValue c)
+                  runControl c $ loopRecolor (runGamma c) (runRecolor c) convertValue
 
 data ConfigControl m g r = ConfigControl { runControl :: forall a. m a -> IO a
                                          , runGamma   :: forall a. g a -> IO (StM g a)
                                          , runRecolor :: forall a. r a -> IO (StM r a)
-                                         , coerceValue :: GammaValue g -> RecolorValue r
                                          }
diff --git a/src/Blucontrol/RGB.hs b/src/Blucontrol/RGB.hs
--- a/src/Blucontrol/RGB.hs
+++ b/src/Blucontrol/RGB.hs
@@ -2,8 +2,6 @@
 
 module Blucontrol.RGB (
   RGB (..)
-, mapRGB
-, word8ToFloat
 ) where
 
 import Control.DeepSeq
@@ -11,6 +9,8 @@
 import Data.Word
 import GHC.Generics
 
+import Blucontrol.CompatibleValues
+
 -- | Values for the colors 'red', 'green' and 'blue'
 data RGB a = RGB { red :: a
                  , green :: a
@@ -47,5 +47,6 @@
                    , blue = f $ blue rgb
                    }
 
-word8ToFloat :: Word8 -> Float
-word8ToFloat = (/ fromIntegral (maxBound @Word8)) . fromIntegral
+instance CompatibleValues (RGB Word8) (RGB Float) where
+  convertValue = mapRGB word8ToFloat
+    where word8ToFloat = (/ fromIntegral (maxBound @Word8)) . fromIntegral
diff --git a/src/Blucontrol/RGB/Temperature.hs b/src/Blucontrol/RGB/Temperature.hs
--- a/src/Blucontrol/RGB/Temperature.hs
+++ b/src/Blucontrol/RGB/Temperature.hs
@@ -1,8 +1,7 @@
-{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE RecordWildCards, UndecidableInstances #-}
 
 module Blucontrol.RGB.Temperature (
   Temperature
-, toRGBWord8
 ) where
 
 import Control.DeepSeq
@@ -10,6 +9,7 @@
 import Data.Word
 import GHC.Generics
 
+import Blucontrol.CompatibleValues
 import Blucontrol.RGB
 
 -- | Arbitrary precision temperature in Kelvin
@@ -25,25 +25,27 @@
 instance Default Temperature where
   def = 6600
 
--- TODO: Test and implement more accurately. Currently based on blugon. Don't enforce Word8.
-toRGBWord8 :: Temperature -> RGB Word8
-toRGBWord8 (Temperature temp) = RGB {..}
-  where red = round . inBounds $
-          if t <= 66
-             then 255
-             else 329.698727446 * ((t - 60) ** (-0.1332047592))
-        green = round . inBounds $
-          if t <= 66
-             then 99.4708025861 * log t - 161.1195681661
-             else 288.1221695283 * ((t - 60) ** (-0.0755148492))
-        blue = round . inBounds $
-          if t <= 0
-             then 0
-             else if t >= 66
-                     then 255
-                     else 138.5177312231 * log (t - 10) - 305.0447927307
-        t = fromRational $ temp / 100 :: Double
-        inBounds x
-          | x < 0 = 0
-          | x > 255 = 255
-          | otherwise = x
+instance CompatibleValues (RGB Word8) a => CompatibleValues Temperature a where
+  -- TODO: Test and implement more accurately. Currently based on blugon.
+  convertValue = convertValue . toRGBWord8
+    where toRGBWord8 :: Temperature -> RGB Word8
+          toRGBWord8 (Temperature temp) = RGB {..}
+            where red = round . inBounds $
+                    if t <= 66
+                       then 255
+                       else 329.698727446 * ((t - 60) ** (-0.1332047592))
+                  green = round . inBounds $
+                    if t <= 66
+                       then 99.4708025861 * log t - 161.1195681661
+                       else 288.1221695283 * ((t - 60) ** (-0.0755148492))
+                  blue = round . inBounds $
+                    if t <= 0
+                       then 0
+                       else if t >= 66
+                               then 255
+                               else 138.5177312231 * log (t - 10) - 305.0447927307
+                  t = fromRational $ temp / 100 :: Double
+                  inBounds x
+                    | x < 0 = 0
+                    | x > 255 = 255
+                    | otherwise = x
