diff --git a/ditto-lucid.cabal b/ditto-lucid.cabal
--- a/ditto-lucid.cabal
+++ b/ditto-lucid.cabal
@@ -1,5 +1,5 @@
 Name:                ditto-lucid
-Version:             0.3
+Version:             0.3.1
 Synopsis:            Add support for using lucid with Ditto
 Description:         Ditto is a library for building and validating forms using applicative functors. This package add support for using ditto with lucid.
 License:             BSD3
@@ -25,7 +25,7 @@
   build-depends:
       base >4.5 && <5
     , lucid < 3.0.0
-    , ditto >= 0.3 && <= 0.4
+    , ditto >= 0.3.1 && <= 0.4
     , text >= 0.11 && < 1.3
     , path-pieces
   hs-source-dirs: src
diff --git a/src/Ditto/Lucid/Named.hs b/src/Ditto/Lucid/Named.hs
--- a/src/Ditto/Lucid/Named.hs
+++ b/src/Ditto/Lucid/Named.hs
@@ -18,7 +18,7 @@
 foldTraverse_ f = traverse_ (fold . f)
 
 inputText
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> String
   -> text
@@ -28,7 +28,7 @@
   inputField i a = input_ [type_ "text", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputTextMReq
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> String
   -> Maybe text
@@ -39,7 +39,7 @@
   inputField i (Just a) = input_ [type_ "text", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a), required_ "required"]
 
 inputPassword
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> String
   -> text
@@ -49,7 +49,7 @@
   inputField i a = input_ [type_ "password", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputSubmit
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> String
   -> text
@@ -59,7 +59,7 @@
   inputField i a = input_ [type_ "submit", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputReset
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => String
   -> text
   -> Form m input err (HtmlT f ()) ()
@@ -68,7 +68,7 @@
   inputField i = input_ [type_ "submit", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece lbl)]
 
 inputHidden
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> String
   -> text
@@ -78,7 +78,7 @@
   inputField i a = input_ [type_ "hidden", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputButton
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => String
   -> text
   -> Form m input err (HtmlT f ()) ()
@@ -87,7 +87,7 @@
   inputField i = input_ [type_ "button", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece lbl)]
 
 textarea
-  :: (Monad m, FormError err input, ToHtml text, Monad f)
+  :: (Monad m, FormError input err, ToHtml text, Monad f)
   => (input -> Either err text)
   -> Int -- ^ cols
   -> Int -- ^ rows
@@ -109,7 +109,7 @@
 --
 -- This control may succeed even if the user does not actually select a file to upload. In that case the uploaded name will likely be \"\" and the file contents will be empty as well.
 inputFile
-  :: (Monad m, FormError err input, FormInput input, Applicative f)
+  :: (Monad m, FormError input err, FormInput input, Applicative f)
   => String
   -> Form m input err (HtmlT f ()) (FileType input)
 inputFile name = G.inputFile name fileView
@@ -118,7 +118,7 @@
 
 -- | Create a @\<button type=\"submit\"\>@ element
 buttonSubmit
-  :: (Monad m, FormError err input, PathPiece text, ToHtml children, Monad f)
+  :: (Monad m, FormError input err, PathPiece text, ToHtml children, Monad f)
   => (input -> Either err text)
   -> String
   -> text
@@ -132,7 +132,7 @@
 --
 -- This element does not add any data to the form data set.
 buttonReset
-  :: (Monad m, FormError err input, Monad f)
+  :: (Monad m, FormError input err, Monad f)
   => String
   -> HtmlT f ()
   -> Form m input err (HtmlT f ()) ()
@@ -144,7 +144,7 @@
 --
 -- This element does not add any data to the form data set.
 button
-  :: (Monad m, FormError err input, Monad f)
+  :: (Monad m, FormError input err, Monad f)
   => String
   -> HtmlT f ()
   -> Form m input err (HtmlT f ()) ()
@@ -170,7 +170,7 @@
 arbitraryHtml = view
 
 inputInt
-  :: (Monad m, FormError err input, Applicative f)
+  :: (Monad m, FormError input err, Applicative f)
   => (input -> Either err Int)
   -> String
   -> Int
@@ -186,7 +186,7 @@
       ]
 
 inputDouble
-  :: (Monad m, FormError err input, Applicative f)
+  :: (Monad m, FormError input err, Applicative f)
   => (input -> Either err Double)
   -> String
   -> Double
@@ -201,7 +201,7 @@
 --
 -- see also 'inputCheckboxes'
 inputCheckbox
-  :: forall err input m f. (Monad m, FormError err input, Applicative f)
+  :: forall err input m f. (Monad m, FormError input err, Applicative f)
   => Bool -- ^ initially checked
   -> String -- ^
   -> Form m input err (HtmlT f ()) Bool
@@ -233,7 +233,7 @@
 -- | Create a group of @\<input type=\"checkbox\"\>@ elements
 --
 inputCheckboxes
-  :: (Functor m, Monad m, FormError err input, FormInput input, ToHtml lbl, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, ToHtml lbl, Monad f)
   => String
   -> [(a, lbl)] -- ^ value, label, initially checked
   -> (a -> Bool) -- ^ function which indicates if a value should be checked initially
@@ -251,7 +251,7 @@
 
 -- | Create a group of @\<input type=\"radio\"\>@ elements
 inputRadio
-  :: (Functor m, Monad m, FormError err input, FormInput input, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, Monad f)
   => String
   -> [(a, Html ())] -- ^ value, label, initially checked
   -> (a -> Bool) -- ^ isDefault
@@ -272,7 +272,7 @@
 --
 -- see also: 'selectMultiple'
 select
-  :: (Functor m, Monad m, FormError err input, FormInput input, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, Monad f)
   => String
   -> [(a, Html ())] -- ^ value, label
   -> (a -> Bool) -- ^ isDefault, must match *exactly one* element in the list of choices
@@ -295,7 +295,7 @@
 --
 -- This creates a @\<select\>@ element which allows more than one item to be selected.
 selectMultiple
-  :: (Functor m, Monad m, FormError err input, FormInput input, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, Monad f)
   => String
   -> [(a, Html ())] -- ^ value, label, initially checked
   -> (a -> Bool) -- ^ isSelected initially
diff --git a/src/Ditto/Lucid/Unnamed.hs b/src/Ditto/Lucid/Unnamed.hs
--- a/src/Ditto/Lucid/Unnamed.hs
+++ b/src/Ditto/Lucid/Unnamed.hs
@@ -18,7 +18,7 @@
 foldTraverse_ f = traverse_ (fold . f)
 
 inputText
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> text
   -> Form m input err (HtmlT f ()) text
@@ -27,7 +27,7 @@
   inputField i a = input_ [type_ "text", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputTextMReq
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> Maybe text
   -> Form m input err (HtmlT f ()) text
@@ -37,7 +37,7 @@
   inputField i (Just a) = input_ [type_ "text", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a), required_ "required"]
 
 inputPassword
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> text
   -> Form m input err (HtmlT f ()) text
@@ -46,7 +46,7 @@
   inputField i a = input_ [type_ "password", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputSubmit
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> text
   -> Form m input err (HtmlT f ()) (Maybe text)
@@ -55,7 +55,7 @@
   inputField i a = input_ [type_ "submit", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputReset
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => text
   -> Form m input err (HtmlT f ()) ()
 inputReset lbl = G.inputNoData inputField
@@ -63,7 +63,7 @@
   inputField i = input_ [type_ "submit", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece lbl)]
 
 inputHidden
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => (input -> Either err text)
   -> text
   -> Form m input err (HtmlT f ()) text
@@ -72,7 +72,7 @@
   inputField i a = input_ [type_ "hidden", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece a)]
 
 inputButton
-  :: (Monad m, FormError err input, PathPiece text, Applicative f)
+  :: (Monad m, FormError input err, PathPiece text, Applicative f)
   => text
   -> Form m input err (HtmlT f ()) ()
 inputButton lbl = G.inputNoData inputField
@@ -80,7 +80,7 @@
   inputField i = input_ [type_ "button", id_ (encodeFormId i), name_ (encodeFormId i), value_ (toPathPiece lbl)]
 
 textarea
-  :: (Monad m, FormError err input, ToHtml text, Monad f)
+  :: (Monad m, FormError input err, ToHtml text, Monad f)
   => (input -> Either err text)
   -> Int -- ^ cols
   -> Int -- ^ rows
@@ -101,7 +101,7 @@
 --
 -- This control may succeed even if the user does not actually select a file to upload. In that case the uploaded name will likely be \"\" and the file contents will be empty as well.
 inputFile
-  :: (Monad m, FormError err input, FormInput input, Applicative f)
+  :: (Monad m, FormError input err, FormInput input, Applicative f)
   => Form m input err (HtmlT f ()) (FileType input)
 inputFile = G.inputFile fileView
   where
@@ -109,7 +109,7 @@
 
 -- | Create a @\<button type=\"submit\"\>@ element
 buttonSubmit
-  :: (Monad m, FormError err input, PathPiece text, ToHtml children, Monad f)
+  :: (Monad m, FormError input err, PathPiece text, ToHtml children, Monad f)
   => (input -> Either err text)
   -> text
   -> children
@@ -122,7 +122,7 @@
 --
 -- This element does not add any data to the form data set.
 buttonReset
-  :: (Monad m, FormError err input, ToHtml children, Monad f)
+  :: (Monad m, FormError input err, ToHtml children, Monad f)
   => children
   -> Form m input err (HtmlT f ()) ()
 buttonReset c = G.inputNoData inputField 
@@ -133,7 +133,7 @@
 --
 -- This element does not add any data to the form data set.
 button
-  :: (Monad m, FormError err input, ToHtml children, Monad f)
+  :: (Monad m, FormError input err, ToHtml children, Monad f)
   => children
   -> Form m input err (HtmlT f ()) ()
 button c = G.inputNoData inputField
@@ -168,7 +168,7 @@
       )
 
 inputInt
-  :: (Monad m, FormError err input, Applicative f)
+  :: (Monad m, FormError input err, Applicative f)
   => (input -> Either err Int)
   -> Int
   -> Form m input err (HtmlT f ()) Int
@@ -183,7 +183,7 @@
       ]
 
 inputDouble
-  :: (Monad m, FormError err input, Applicative f)
+  :: (Monad m, FormError input err, Applicative f)
   => (input -> Either err Double)
   -> Double
   -> Form m input err (HtmlT f ()) Double
@@ -197,7 +197,7 @@
 --
 -- see also 'inputCheckboxes'
 inputCheckbox
-  :: forall err input m f. (Monad m, FormError err input, Applicative f)
+  :: forall err input m f. (Monad m, FormError input err, Applicative f)
   => Bool -- ^ initially checked
   -> Form m input err (HtmlT f ()) Bool
 inputCheckbox initiallyChecked =
@@ -228,7 +228,7 @@
 -- | Create a group of @\<input type=\"checkbox\"\>@ elements
 --
 inputCheckboxes
-  :: (Functor m, Monad m, FormError err input, FormInput input, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, Monad f)
   => [(a, Html ())] -- ^ value, label, initially checked
   -> (a -> Bool) -- ^ function which indicates if a value should be checked initially
   -> Form m input err (HtmlT f ()) [a]
@@ -247,7 +247,7 @@
 
 -- | Create a group of @\<input type=\"radio\"\>@ elements
 inputRadio
-  :: (Functor m, Monad m, FormError err input, FormInput input, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, Monad f)
   => [(a, Html ())] -- ^ value, label, initially checked
   -> (a -> Bool) -- ^ isDefault
   -> Form m input err (HtmlT f ()) a
@@ -267,7 +267,7 @@
 --
 -- see also: 'selectMultiple'
 select
-  :: (Functor m, Monad m, FormError err input, FormInput input, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, Monad f)
   => [(a, Html ())] -- ^ value, label
   -> (a -> Bool) -- ^ isDefault, must match *exactly one* element in the list of choices
   -> Form m input err (HtmlT f ()) a
@@ -290,7 +290,7 @@
 --
 -- This creates a @\<select\>@ element which allows more than one item to be selected.
 selectMultiple
-  :: (Functor m, Monad m, FormError err input, FormInput input, Monad f)
+  :: (Functor m, Monad m, FormError input err, FormInput input, Monad f)
   => [(a, Html ())] -- ^ value, label, initially checked
   -> (a -> Bool) -- ^ isSelected initially
   -> Form m input err (HtmlT f ()) [a]
