I've changed the representation of the type FT_Outline.
The corresponding C type is not an opaque handle, its a struct so it needs filling out. I hadn't really been sure what to do about this - most of the FFI examples I've looked at a fortunate enough to have to deal with opaque handles for a lot of the crossing over into C. I did find a nice example idiom that does what I want in the the Time library on Hackage (the getCTimeval function in the Data.Time.Clock.CTimeval module) .