Sander,
Good question!
I have used the third option in most of my workflow implementations. This provides me with the ability to quickly and easily retrieve workflow information from workflow context objects, which seems to be something that is a common requirement in workflow related applications. For instance, if my workflow context object is an invoice that is approved for payment via a workflow, it seems that finding out the approval status and history of that invoice is something I would want to do often.
One note: I usually create the association between the workflow context object and workflow and/or user task view objects as those are the history objects for a workflow. Workflow and UserTask objects only exist if a workflow is currently executing. WorkflowView and UserTaskView exist both while the workflow is executing and after it is complete.
Hope that helps,
Mike