diff --git a/SimpleForm.hs b/SimpleForm.hs
--- a/SimpleForm.hs
+++ b/SimpleForm.hs
@@ -43,6 +43,7 @@
 	select,
 	multi_select,
 	radio_buttons,
+	buttons,
 	checkboxes,
 	-- * Helpers
 	input_tag,
@@ -205,7 +206,7 @@
 	wdef = time
 
 instance (Integral a, Show a) => DefaultWidget (Ratio a) where
-	wdef = number
+	wdef = number . fmap (\x -> realToFrac x :: Double)
 
 instance (DefaultWidget a, DefaultWidget b) => DefaultWidget (a, b) where
 	wdef v u n opt = wdef (fmap fst v) u n opt `mappend` wdef (fmap snd v) u n opt
@@ -446,6 +447,23 @@
 		mkChecked (Just value == v) $
 			input_tag n (Just value) (T.pack "radio") [] opt
 		HTML.toHtml label
+	formatCollection f
+		| length collection == 1 && fst (head collection) == mempty =
+			f (snd $ head collection)
+		| otherwise =
+			(`map` collection) $ \(group, subCollection) ->
+				HTML.fieldset $ do
+					HTML.legend $ HTML.toHtml group
+					mconcat (f subCollection)
+
+buttons :: GroupedCollection -> Widget Text
+buttons collection _ u n opt =
+	MultiInput $ formatCollection $ map go
+	where
+	go (value, label) =
+		let SelfLabelInput html =
+			button (Just value) u n (opt {label = Just $ Label label})
+		in html
 	formatCollection f
 		| length collection == 1 && fst (head collection) == mempty =
 			f (snd $ head collection)
diff --git a/SimpleForm/Combined.hs b/SimpleForm/Combined.hs
--- a/SimpleForm/Combined.hs
+++ b/SimpleForm/Combined.hs
@@ -43,6 +43,7 @@
 	select,
 	multi_select,
 	radio_buttons,
+	buttons,
 	checkboxes,
 	-- * Helpers
 	selectEnum,
@@ -156,6 +157,12 @@
 radio_buttons :: GroupedCollection' a -> (Widget Text, Validation a)
 radio_buttons collection = (
 		SimpleForm.radio_buttons (Validation.viewGroupedCollection collection),
+		Validation.includes collection
+	)
+
+buttons :: GroupedCollection' a -> (Widget Text, Validation a)
+buttons collection = (
+		SimpleForm.buttons (Validation.viewGroupedCollection collection),
 		Validation.includes collection
 	)
 
diff --git a/SimpleForm/Digestive/Combined.hs b/SimpleForm/Digestive/Combined.hs
--- a/SimpleForm/Digestive/Combined.hs
+++ b/SimpleForm/Digestive/Combined.hs
@@ -3,6 +3,7 @@
 -- The Combined module both renders to 'Html' and also parses input.
 module SimpleForm.Digestive.Combined (
 	SimpleForm,
+	SimpleForm',
 	postSimpleForm,
 	getSimpleForm,
 	simpleForm',
@@ -37,14 +38,17 @@
 
 import SimpleForm.Render
 
+-- | Convenience type synonym for combined forms
+type SimpleForm' m a = SimpleForm a (Form Html m a)
+
 -- | Render a 'SimpleForm' to 'Html'
 --
 -- This produces the contents of the form, but you must still wrap it in
 -- the actual \<form\> element.
 getSimpleForm :: (Monad m) =>
 	Renderer
-	-> Maybe a                      -- ^ Default values for the form
-	-> SimpleForm a (Form Html m a) -- ^ The simple form to render
+	-> Maybe a         -- ^ Default values for the form
+	-> SimpleForm' m a -- ^ The simple form to render
 	-> m Html
 getSimpleForm render val form = do
 		view <- getForm T.empty initialForm
@@ -62,8 +66,8 @@
 -- the actual \<form\> element.
 postSimpleForm :: (Monad m) =>
 	Renderer
-	-> m (Env m)                    -- ^ The digestive-functors input environment
-	-> SimpleForm a (Form Html m a) -- ^ The simple form to render
+	-> m (Env m)       -- ^ The digestive-functors input environment
+	-> SimpleForm' m a -- ^ The simple form to render
 	-> m (Html, Maybe a)
 postSimpleForm render env form = do
 		env' <- env
diff --git a/SimpleForm/Digestive/Internal.hs b/SimpleForm/Digestive/Internal.hs
--- a/SimpleForm/Digestive/Internal.hs
+++ b/SimpleForm/Digestive/Internal.hs
@@ -70,9 +70,12 @@
 	render $ renderOptions
 		(maybe Nothing sel env) unparsed (pathToText apth) w errors $
 			opt {
+				label = defaultLabel (label opt),
 				disabled = disabled opt || Disabled `elem` metadata
 			}
 	where
+	defaultLabel (Just DefaultLabel) = Just $ Label $ humanize n
+	defaultLabel x = x
 	apth = case absolutePath n view of
 		(p:ps)
 			| T.null p -> ps
diff --git a/SimpleForm/Render/XHTML5.hs b/SimpleForm/Render/XHTML5.hs
--- a/SimpleForm/Render/XHTML5.hs
+++ b/SimpleForm/Render/XHTML5.hs
@@ -16,6 +16,7 @@
 render opt@(RenderOptions {
 		name = n,
 		widgetHtml = Input whtml,
+		errors = errors,
 		options = InputOptions {
 			label = lbl,
 			disabled = d,
@@ -25,6 +26,7 @@
 		}
 	}) =
 		applyAttrs (
+			maybeCons (not $ null errors) (T.pack "class", T.pack "error") $
 			maybeCons d (T.pack "class", T.pack "disabled") $
 			maybeCons r (T.pack "class", T.pack "required")
 			[]
@@ -44,6 +46,7 @@
 		}
 	}) =
 		applyAttrs (
+			maybeCons (not $ null errors) (T.pack "class", T.pack "error") $
 			maybeCons d (T.pack "class", T.pack "disabled") $
 			maybeCons r (T.pack "class", T.pack "required")
 			[]
@@ -56,6 +59,7 @@
 render opt@(RenderOptions {
 		name = n,
 		widgetHtml = MultiInput whtml,
+		errors = errors,
 		options = InputOptions {
 			label = lbl,
 			disabled = d,
@@ -65,6 +69,7 @@
 		}
 	}) =
 		applyAttrs (
+			maybeCons (not $ null errors) (T.pack "class", T.pack "error") $
 			maybeCons d (T.pack "disabled", T.pack "disabled") $
 			maybeCons d (T.pack "class", T.pack "disabled") $
 			maybeCons r (T.pack "class", T.pack "required")
diff --git a/simple-form.cabal b/simple-form.cabal
--- a/simple-form.cabal
+++ b/simple-form.cabal
@@ -1,5 +1,5 @@
 name:            simple-form
-version:         0.2
+version:         0.3
 cabal-version:   >= 1.8
 license:         OtherLicense
 license-file:    COPYING
