diff --git a/prizm.cabal b/prizm.cabal
--- a/prizm.cabal
+++ b/prizm.cabal
@@ -1,5 +1,5 @@
 name:                prizm
-version:             1.0.5
+version:             1.1.0
 synopsis:            Color transformations in different color spaces
 homepage:            https://github.com/ixmatus/prizm
 license:             BSD3
@@ -98,7 +98,7 @@
 test-suite tests
   type:           exitcode-stdio-1.0
   hs-source-dirs: tests
-  main-is:        QC.hs
+  main-is:        Test.hs
   default-language: Haskell2010
   other-modules:
     QC.SRGB
diff --git a/src/Data/Prizm/Color/CIE.hs b/src/Data/Prizm/Color/CIE.hs
--- a/src/Data/Prizm/Color/CIE.hs
+++ b/src/Data/Prizm/Color/CIE.hs
@@ -40,17 +40,16 @@
   black = CIELCH 100.0 0.0 360.0
 
 instance BlendableColor CIELCH where
-  -- | Interpolate two colors in the @CIE L*Ch* color space with a
+  -- | Interpolate two colors in the @CIE L*C*h@ color space with a
   -- weight.
   --
   -- Weight is applied left to right, so if a weight of 25% is supplied,
   -- then the color on the left will be multiplied by 25% and the second
   -- color will be multiplied by 75%.
   interpolate w ((CIELCH al ac ah), (CIELCH bl bc bh)) =
-    let w' = pct $ pctClamp w
-        (CIELCH l c h) = (CIELCH (al - bl) (ac - bc) (ah - bh))
-        (CIELCH nl nc nh) = omap (*w') (CIELCH l c (shortestPath h))
-    in CIELCH (nl + al) (nc + ac) (nh + ah)
+    let w' = pct w
+        (CIELCH nl nc nh) = omap (*w') (CIELCH (bl - al) (bc - ac) (shortestPath (bh - ah)))
+    in CIELCH (al + nl) (ac + nc) (ah + nh)
 
 instance AdjustableColor CIELCH where
   -- | Adjust the lightness / darkness of a color.
@@ -82,7 +81,6 @@
 v2 :: Double
 v2 = 1/3 * ((29/6) ** 2)
 
-
 -- | Reference white, 2deg observer, d65 illuminant.
 --
 -- @[x,y,z]@
@@ -120,8 +118,8 @@
 -- | Transform an 'CIEXYZ' 'Double' to be computed against the
 -- xyzToRGB matrix.
 transformRGB :: Double -> Integer
-transformRGB v | v > 0.0031308 = min (round ((1.055 * (v ** (1 / 2.4)) - 0.055) * 255)) 255
-               | otherwise     = min (round ((12.92 * v) * 255)) 255
+transformRGB v | v > 0.0031308 = min (round (255 * (1.055 * (v ** (1 / 2.4)) - 0.055))) 255
+               | otherwise     = min (round (255 * (12.92 * v))) 255
 
 -- | Convert an XYZ color to an SRGB color.
 --
@@ -130,7 +128,9 @@
 toRGBMatrix :: XYZtoRGB -> CIEXYZ -> RGB
 toRGBMatrix (XYZtoRGB m) (CIEXYZ x y z) =
     let t = ZipList ((/100) <$> [x,y,z])
-        [r,g,b] = S.clamp <$> (fromIntegral . transformRGB) <$> ((zipTransform t) <$> m)
+        -- NB: be sure to clamp before converting to a Word8,
+        -- otherwise we can overflow!
+        [r,g,b] = (fromIntegral . S.clamp . transformRGB) <$> ((zipTransform t) <$> m)
     in RGB r g b
 
 ------------------------------------------------------------------------------
@@ -150,7 +150,7 @@
     let y = (l + 16) / 116
         x = a / 500 + y
         z = y - b / 200
-        [nx,ny,nz] = getZipList $ ((*) <$> ZipList ((transformXYZ) <$> [x,y,z])) <*> ZipList refWhite
+        [nx,ny,nz] = getZipList $ ((*) <$> ZipList (transformXYZ <$> [x,y,z])) <*> ZipList refWhite
     in Right $ CIEXYZ nx ny nz
 
 instance Convertible CIELAB RGB where
@@ -165,10 +165,18 @@
   -- | Convert a S'RGB' to a 'CIELAB'
   safeConvert = convertVia (undefined :: CIEXYZ)
 
+instance Convertible RGB CIELCH where
+  -- | Convert a S'RGB' to a 'CIELCH'
+  safeConvert = convertVia (undefined :: CIELAB)
+
 instance Convertible Hex CIELAB where
   -- | Convert an S'RGB' hexadecimal color to a 'CIELAB'
   safeConvert = convertVia (undefined :: RGB)
 
+instance Convertible Hex CIELCH where
+  -- | Convert an S'RGB' hexadecimal color to a 'CIELCH'
+  safeConvert = convertVia (undefined :: RGB)
+
 instance Convertible CIELCH CIELAB where
   -- | Convert a 'CIELCH' to a 'CIELAB'
   safeConvert (CIELCH l c h) =
@@ -177,7 +185,7 @@
 
 instance Convertible CIELCH RGB where
   -- | Convert a 'CIELCH' to a S'RGB'
-  safeConvert = convertVia (undefined :: CIEXYZ)
+  safeConvert = convertVia (undefined :: CIELAB)
 
 instance Convertible CIELCH CIEXYZ where
   safeConvert = convertVia (undefined :: CIELAB)
diff --git a/src/Data/Prizm/Color/SRGB.hs b/src/Data/Prizm/Color/SRGB.hs
--- a/src/Data/Prizm/Color/SRGB.hs
+++ b/src/Data/Prizm/Color/SRGB.hs
@@ -30,7 +30,6 @@
 import           Data.String
 import qualified Data.Text                     as T
 import           Data.Text.Read                as R
-import           Data.Word
 import           Numeric                       (showHex)
 
 instance PresetColor RGB where
@@ -49,7 +48,7 @@
 
 -- | Clamp a 'Word8' with an upper-bound of 255 (the maximum RGB
 -- value).
-clamp :: Word8 -> Word8
+clamp :: Integral a => a -> a
 clamp i = max (min i 255) 0
 
 -- All credit for the below three functions go to the HSColour module.
diff --git a/src/Data/Prizm/Types.hs b/src/Data/Prizm/Types.hs
--- a/src/Data/Prizm/Types.hs
+++ b/src/Data/Prizm/Types.hs
@@ -119,7 +119,7 @@
 pct :: Percent -> Double
 pct i = fromIntegral m / 100
   where
-    m = max (-100) $ min 100 i
+    m = pctClamp i
 
 -- | Clamp a @Percent@ value in the range -100 to 100.
 pctClamp :: Percent -> Percent
diff --git a/tests/QC.hs b/tests/QC.hs
deleted file mode 100644
--- a/tests/QC.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
-
-module Main (main) where
-
-import qualified QC.CIE         as CIE
-import qualified QC.SRGB        as SRGB
-import           Test.Framework (Test, defaultMain, testGroup)
-
-main :: IO ()
-main = defaultMain tests
-
-tests :: [Test]
-tests =
-  [ testGroup "SRGB" SRGB.tests
-  , testGroup "CIE"  CIE.tests
-  ]
diff --git a/tests/Test.hs b/tests/Test.hs
new file mode 100644
--- /dev/null
+++ b/tests/Test.hs
@@ -0,0 +1,16 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module Main (main) where
+
+import qualified QC.CIE         as CIE
+import qualified QC.SRGB        as SRGB
+import           Test.Framework (Test, defaultMain, testGroup)
+
+main :: IO ()
+main = defaultMain tests
+
+tests :: [Test]
+tests =
+  [ testGroup "SRGB" SRGB.tests
+  , testGroup "CIE"  CIE.tests
+  ]
