Always use the most abstracted interface that fulfills your needs.
In the example of Iterable, Collection, List, if you only need to iterate then only pass around an Iterable. If you only need methods provided by Collection then only pass around a collection.
The reason for this is so that you can easily replace later.
For example, if you have a function that only needs an Iterable but takes a List as a function parameter, then later if you decide that it makes more sense to store your data as a HashSet you have to change a lot of code to make it work. However, since HashSet is Iterable, if you had just passed an Iterable to your function originally you would have had to change much less code.
It also makes testing easier in some cases. For example, Imagine you have some interface Foo that extends interface Bar. If you have a function that takes a Foo parameter then you have to mock everything that Bar expects and you have to mock everything that Foo adds onto that. If your function only expected a Bar parameter then you only have to mock Bar.