Your particular example can be made to work as follows:
{-# LANGUAGE ImpredicativeTypes, RankNTypes #-}
import Data.Machine
f = (return :: (forall a. Process a a) -> IO (forall a. Process a a)) (auto id)
As Carl says, you have to annotate functions that you want to use impredicatively, such as return
here. Even then, working with impredicative types in GHC is somewhat fragile. I wouldn't recommend it. The reasons for the restrictions are simply that it's tricky to perform type inference in the presence of impredicative types, and additionally, Haskell's surface language has no proper syntax to specify the type at which you want to instantiate a polymorphic function.
A common workaround is to wrap stuff up in a newtype
:
data PolyProcess = PP (forall a. Process a a)
f' :: IO PolyProcess
f' = return $ PP $ auto $ id