diff --git a/coordinate.cabal b/coordinate.cabal
--- a/coordinate.cabal
+++ b/coordinate.cabal
@@ -1,7 +1,7 @@
 name:               coordinate
-version:            0.0.9
+version:            0.0.10
 license:            BSD3
-license-File:       etc/LICENCE
+license-file:       etc/LICENCE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
 maintainer:         Tony Morris
 copyright:          Copyright (C) 2013-2014 Tony Morris
@@ -25,8 +25,9 @@
                     Haskell2010
 
   build-depends:
-                    base < 5 && >= 3
-                    , lens >= 3.10
+                      base < 5 && >= 3
+                    , lens >= 4.0
+                    , transformers >= 0.3.0.0
 
   ghc-options:
                     -Wall
@@ -58,11 +59,12 @@
                     Haskell2010
 
   build-depends:
-                    base < 5 && >= 3,
-                    doctest >= 0.9.7,
-                    filepath >= 1.3,
-                    directory >= 1.1,
-                    QuickCheck >= 2.0
+                      base < 5 && >= 3
+                    , doctest >= 0.9.7
+                    , filepath >= 1.3
+                    , directory >= 1.1
+                    , QuickCheck >= 2.0
+                    , template-haskell >= 2.8
 
   ghc-options:
                     -Wall
diff --git a/src/Data/Geo/Coordinate/Coordinate.hs b/src/Data/Geo/Coordinate/Coordinate.hs
--- a/src/Data/Geo/Coordinate/Coordinate.hs
+++ b/src/Data/Geo/Coordinate/Coordinate.hs
@@ -1,7 +1,13 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RankNTypes #-}
+
 module Data.Geo.Coordinate.Coordinate(
   Coordinate
 , (.#.)
-, (..#..)
+, (<°>)
+, (<㎭>)
+, fracCoordinate
+, radianCoordinate
 , HasCoordinate(..)
 , coordinateLatLon
 , coordinateLonLat
@@ -10,15 +16,20 @@
 , coordinateDMSLatDMSLon
 ) where
 
-import Prelude(Eq, Show, Ord, Double, id, return, (.))
+import Control.Category(Category(id, (.)))
+import Control.Lens(Iso', Lens', Prism', iso, lens, prism', mapping, swapped, withIso, (^?), (#))
+import Control.Monad(Monad(return))
+import Data.Eq(Eq)
+import Data.Geo.Coordinate.Latitude(HasLatitude(latitude), Latitude, dmsLatitude, radianLatitude, fracLatitude)
+import Data.Geo.Coordinate.Longitude(HasLongitude(longitude), Longitude, dmsLongitude, radianLongitude, fracLongitude)
+import Data.Geo.Coordinate.DegreesLatitude(HasDegreesLatitude(degreesLatitude), DegreesLatitude)
+import Data.Geo.Coordinate.DegreesLongitude(HasDegreesLongitude(degreesLongitude), DegreesLongitude)
+import Data.Geo.Coordinate.Minutes(Minutes)
+import Data.Geo.Coordinate.Seconds(Seconds)
 import Data.Maybe(Maybe)
-import Control.Lens(Iso', Lens', iso, lens, mapping, swapped, withIso, (^?))
-import Data.Geo.Coordinate.Latitude
-import Data.Geo.Coordinate.Longitude
-import Data.Geo.Coordinate.DegreesLatitude
-import Data.Geo.Coordinate.DegreesLongitude
-import Data.Geo.Coordinate.Minutes
-import Data.Geo.Coordinate.Seconds
+import Data.Ord(Ord)
+import Data.Tuple(curry, uncurry)
+import Prelude(Show, Double)
 
 data Coordinate =
   Coordinate
@@ -36,19 +47,59 @@
 
 -- | Build a coordinate from a fractional latitude and fractional longitude. Fails
 -- if either are out of range.
-(..#..) ::
+(<°>) ::
   Double
   -> Double
   -> Maybe Coordinate
-lat ..#.. lon =
-  do lat' <- lat ^? fracLatitude
-     lon' <- lon ^? fracLongitude
-     return (lat' .#. lon')
+(<°>) =
+  curry (^? fracCoordinate)
 
+-- | Build a coordinate from a radian latitude and fractional longitude. Fails
+-- if either are out of range.
+(<㎭>) ::
+  Double
+  -> Double
+  -> Maybe Coordinate
+(<㎭>) =
+  curry (^? radianCoordinate)
+ 
+coordinatePrism ::
+  Prism' Double Latitude
+  -> Prism' Double Longitude
+  -> Prism' (Double, Double) Coordinate
+coordinatePrism f g =
+  prism'
+    (\x -> let (b, d) = coordinateLatLon # x
+           in (f # b, g # d))
+    (\(lat, lon) ->
+      do lat' <- lat ^? f
+         lon' <- lon ^? g
+         return (Coordinate lat' lon'))
+
+-- | A prism on the pair (below) to a coordinate:
+-- 
+-- * a fractional latitude to a double between -90 and 90 exclusive.
+--
+-- * a fractional longitude to a double between -180 and 180 exclusive.
+fracCoordinate ::
+  Prism' (Double, Double) Coordinate
+fracCoordinate =
+  coordinatePrism fracLatitude fracLongitude
+
+-- | A prism on the pair (below) to a coordinate:
+-- 
+-- * a radian latitude to a double between -π/2 and π/2 exclusive.
+--
+-- * a radian longitude to a double between -π and π exclusive.
+radianCoordinate ::
+  Prism' (Double, Double) Coordinate
+radianCoordinate =
+  coordinatePrism radianLatitude radianLongitude
+  
 coordinateLatLon ::
   Iso' (Latitude, Longitude) Coordinate
 coordinateLatLon =
-  iso (\(lat, lon) -> Coordinate lat lon) (\(Coordinate lat lon) -> (lat, lon))
+  iso (uncurry Coordinate) (\(Coordinate lat lon) -> (lat, lon))
 
 coordinateLonLat ::
   Iso' (Longitude, Latitude) Coordinate
diff --git a/src/Data/Geo/Coordinate/DegreesLatitude.hs b/src/Data/Geo/Coordinate/DegreesLatitude.hs
--- a/src/Data/Geo/Coordinate/DegreesLatitude.hs
+++ b/src/Data/Geo/Coordinate/DegreesLatitude.hs
@@ -1,12 +1,19 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 module Data.Geo.Coordinate.DegreesLatitude(
   DegreesLatitude
 , HasDegreesLatitude(..)
 , nDegreesLatitude
 ) where
 
-import Prelude(Int, Bool(..), Eq, Show, Ord(..), id, (&&))
-import Data.Maybe(Maybe(..))
+import Control.Category(Category(id))
 import Control.Lens(Prism', Lens', prism')
+import Data.Bool((&&))
+import Data.Eq(Eq)
+import Data.Int(Int)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord((<), (>)))
+import Prelude(Show)
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -43,9 +50,9 @@
 nDegreesLatitude =
   prism'
     (\(DegreesLatitude i) -> i)
-    (\i -> case i > -90 && i < 90 of
-             True -> Just (DegreesLatitude i)
-             False -> Nothing)
+    (\i -> if i > -90 && i < 90
+             then Just (DegreesLatitude i)
+             else Nothing)
 
 class HasDegreesLatitude t where
   degreesLatitude ::
diff --git a/src/Data/Geo/Coordinate/DegreesLongitude.hs b/src/Data/Geo/Coordinate/DegreesLongitude.hs
--- a/src/Data/Geo/Coordinate/DegreesLongitude.hs
+++ b/src/Data/Geo/Coordinate/DegreesLongitude.hs
@@ -1,12 +1,19 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 module Data.Geo.Coordinate.DegreesLongitude(
   DegreesLongitude
 , HasDegreesLongitude(..)
 , nDegreesLongitude
 ) where
 
-import Prelude(Int, Bool(..), Eq, Show, Ord(..), id, (&&))
-import Data.Maybe(Maybe(..))
+import Control.Category(Category(id))
 import Control.Lens(Prism', Lens', prism')
+import Data.Bool((&&))
+import Data.Eq(Eq)
+import Data.Int(Int)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord((<), (>)))
+import Prelude(Show)
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -43,9 +50,9 @@
 nDegreesLongitude  =
   prism'
     (\(DegreesLongitude i) -> i)
-    (\i -> case i > -180 && i < 180 of
-             True -> Just (DegreesLongitude i)
-             False -> Nothing)
+    (\i -> if i > -180 && i < 180
+             then Just (DegreesLongitude i)
+             else Nothing)
 
 class HasDegreesLongitude t where
   degreesLongitude ::
diff --git a/src/Data/Geo/Coordinate/Latitude.hs b/src/Data/Geo/Coordinate/Latitude.hs
--- a/src/Data/Geo/Coordinate/Latitude.hs
+++ b/src/Data/Geo/Coordinate/Latitude.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 module Data.Geo.Coordinate.Latitude(
   Latitude
 , HasLatitude(..)
@@ -6,11 +8,15 @@
 , radianLatitude
 ) where
 
-import Prelude(Double, Eq, Show, Ord(..), Num(..), Floating(..), Fractional(..), Bool(..), Monad(..), id, (&&), (.), properFraction, fromIntegral)
+import Control.Category(Category(id, (.)))
 import Control.Lens(Iso', Prism', Lens', iso, prism', lens, (#), (^?))
-import Data.Geo.Coordinate.DegreesLatitude
-import Data.Geo.Coordinate.Minutes
-import Data.Geo.Coordinate.Seconds
+import Control.Monad(Monad(return))
+import Data.Eq(Eq)
+import Data.Geo.Coordinate.DegreesLatitude(HasDegreesLatitude(degreesLatitude), DegreesLatitude, nDegreesLatitude)
+import Data.Geo.Coordinate.Minutes(HasMinutes(minutes), Minutes, nMinutes)
+import Data.Geo.Coordinate.Seconds(HasSeconds(seconds), Seconds, nSeconds)
+import Data.Ord(Ord((<)))
+import Prelude(Double, Show, Num((+), (*), (-), abs), Floating(pi), Fractional((/)), properFraction, fromIntegral)
 
 -- $setup
 -- >>> import Prelude(Functor(..))
diff --git a/src/Data/Geo/Coordinate/Longitude.hs b/src/Data/Geo/Coordinate/Longitude.hs
--- a/src/Data/Geo/Coordinate/Longitude.hs
+++ b/src/Data/Geo/Coordinate/Longitude.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 module Data.Geo.Coordinate.Longitude(
   Longitude
 , HasLongitude(..)
@@ -6,11 +8,16 @@
 , radianLongitude
 ) where
 
-import Prelude(Double, Eq, Show, Ord(..), Num(..), Floating(..), Fractional(..), Bool(..), Monad(..), id, (&&), (.), properFraction, fromIntegral)
+
+import Control.Category(Category(id, (.)))
 import Control.Lens(Iso', Prism', Lens', iso, prism', lens, (#), (^?))
-import Data.Geo.Coordinate.DegreesLongitude
-import Data.Geo.Coordinate.Minutes
-import Data.Geo.Coordinate.Seconds
+import Control.Monad(Monad(return))
+import Data.Eq(Eq)
+import Data.Geo.Coordinate.DegreesLongitude(HasDegreesLongitude(degreesLongitude), DegreesLongitude, nDegreesLongitude)
+import Data.Geo.Coordinate.Minutes(HasMinutes(minutes), Minutes, nMinutes)
+import Data.Geo.Coordinate.Seconds(HasSeconds(seconds), Seconds, nSeconds)
+import Data.Ord(Ord((<)))
+import Prelude(Double, Show, Num((+), (*), (-), abs), Floating(pi), Fractional((/)), properFraction, fromIntegral)
 
 -- $setup
 -- >>> import Prelude(Functor(..))
diff --git a/src/Data/Geo/Coordinate/Minutes.hs b/src/Data/Geo/Coordinate/Minutes.hs
--- a/src/Data/Geo/Coordinate/Minutes.hs
+++ b/src/Data/Geo/Coordinate/Minutes.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 module Data.Geo.Coordinate.Minutes(
   Minutes
 , HasMinutes(..)
@@ -5,10 +7,15 @@
 , modMinutes
 ) where
 
-import Prelude(Functor, Int, Bool(..), Eq, Show, Ord(..), (&&), id)
-import Data.Maybe(Maybe(..))
+import Control.Category(Category(id))
 import Control.Lens(Prism', Lens', prism')
+import Data.Bool((&&))
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Eq(Eq)
+import Data.Int(Int)
 import Data.Fixed(mod')
+import Data.Ord(Ord((>=), (<)))
+import Prelude(Show)
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -62,9 +69,9 @@
 nMinutes =
   prism'
     (\(Minutes i) -> i)
-    (\i -> case i >= 0 && i < 60 of
-             True -> Just (Minutes i)
-             False -> Nothing)
+    (\i -> if i >= 0 && i < 60
+             then Just (Minutes i)
+             else Nothing)
 
 class HasMinutes t where
   minutes ::
diff --git a/src/Data/Geo/Coordinate/Seconds.hs b/src/Data/Geo/Coordinate/Seconds.hs
--- a/src/Data/Geo/Coordinate/Seconds.hs
+++ b/src/Data/Geo/Coordinate/Seconds.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 module Data.Geo.Coordinate.Seconds(
   Seconds
 , HasSeconds(..)
@@ -5,11 +7,16 @@
 , nSeconds
 ) where
 
-import Prelude(Double, Bool(..), Eq, Show(..), Ord(..), id, (&&), (++), showParen, showString)
-import Data.Maybe(Maybe(..))
+import Control.Category(Category(id))
 import Control.Lens(Prism', Lens', prism')
-import Text.Printf(printf)
+import Data.Bool((&&))
+import Data.Eq(Eq)
 import Data.Fixed(mod')
+import Data.Ord(Ord((>), (>=), (<)))
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.List((++))
+import Prelude(Double, Show(showsPrec), showParen, showString)
+import Text.Printf(printf)
 
 -- $setup
 -- >>> import Control.Lens((#), (^?))
@@ -75,9 +82,9 @@
 nSeconds =
   prism'
     (\(Seconds d) -> d)
-    (\d -> case d >= 0 && d < 60 of
-             True -> Just (Seconds d)
-             False -> Nothing)
+    (\d -> if d >= 0 && d < 60
+             then Just (Seconds d)
+             else Nothing)
 
 class HasSeconds t where
   seconds ::
