Data.Monoid in the base package specifies newtypes Sum and Product. It would be convenient if these newtypes had appropriate Num instances, which are trivial to write in plain Haskell:

import Data.Monoid

liftTy2 wrap unwrap op x y = wrap $ unwrap x `op` unwrap y
liftTy wrap unwrap f = wrap . f . unwrap

liftSum = liftTy Sum getSum
liftSum2 = liftTy2 Sum getSum

instance (Num a) => Num (Sum a) where
  (+) = liftSum2 (+)
  (-) = liftSum2 (-)
  (*) = liftSum2 (*)
  abs = liftSum abs
  negate = liftSum negate
  signum = liftSum signum
  fromInteger = Sum . fromInteger

liftProd = liftTy Product getProduct
liftProd2 = liftTy2 Product getProduct

instance (Num a) => Num (Product a) where
  (+) = liftProd2 (+)
  (-) = liftProd2 (-)
  (*) = liftProd2 (*)
  abs = liftProd abs
  negate = liftProd negate
  signum = liftProd signum
  fromInteger = Product . fromInteger

Or with a few extensions (as noted by Daniel Wagner):

{-# LANGUAGE StandaloneDeriving, GeneralizedNewtypeDeriving #-}

import Data.Monoid

deriving instance Num a => Num (Sum a)
deriving instance Num a => Num (Product a)

--
Dan Burton