Consider the following collection.
I
While the code in the accepted answer meets the needs of the original question, it will fall over when handling IEnumerables of more complex objects (since the predicate will tend to throw an exception when comparing the last item in the enumerable with the "next" item [which, by definition, will always be null]).
This version handles more complex objects:
public static IEnumerable> GroupConsecutive(this IEnumerable set, Func predicate)
{
var i = 0;
var k = 0;
var ranges = from e in set
let idx = ++i
let next = set.ElementAtOrDefault(idx)
let key = next == null ? k : (predicate(e, next)) ? k : k++
group e by key into g
select g;
return ranges;
}