If you can encapsulate the control by calling other methods from the Seq module (rather than pattern-matching), then I would suggest doing that.
But there are other times where you do need this fine control on the consuming end (e.g. a parser that may backtrack, but also wants to throw away data from the stream it has already consumed 'for good'), and in this case you really need LazyList. We'll keep LazyList around in the power pack (it won't go away), as there are some scenarios like this that seq cannot handle as well.
Here's a handy function that lets you pattern match seqs by converting them to LazyList under the hood.
#r "FSharp.PowerPack.dll"
let rec (|SeqCons|SeqNil|) (s:seq<'a>) =
match s with
| :? LazyList<'a> as l ->
match l with
| LazyList.Cons(a,b) -> SeqCons(a,(b :> seq<_>))
| LazyList.Nil -> SeqNil
| _ -> (|SeqCons|SeqNil|) (LazyList.of_seq s :> seq<_>)
let rec f s =
match s with
| SeqCons(h,t) -> f t
| SeqNil -> printfn "all done here"
let s = (seq { for i in 0 .. 10000000 do
yield i})
(One small caveat is that LazyList.of_seq doesn't dispose its IEnumerator.)