Methods like Enumerable.Last work terribly if you pass in something that implements IReadOnlyList but not IList. We could provide additional overloads like: public static T Last<T>(this IReadOnlyList<T> list) { ... } so that we now had optimized implementations for these types.
This would also be beneficial so we can have codepaths that avoid having to dynamically check the type of the receiver at runtime when the compiler already knows statically what it can dispatch to.