Teaching the tradeoffs of the foreach loop
I think the advantages are huge, overwhelming.  

They avoid


off by one errors - the bane of the novice programmer 
needing to allocate an explicit iterator - avoiding adding names to the namespace. 


They enable  


thinking about iteration at a higher level than just counting
compact coding  


I use them whenever available. The collection knows its members. Just ask it to yield them up. It is a brilliant design. 

Programs in object-oriented languages like java should not have to all look like C programs, nor should the programmer have to always dip to the level of C to use them. C is a better assembler (for the pop-11). But few programs need that mind-set. 

My preference is to teach concepts from the top-down. Higher level thinking means (in part) "closer to the language of the problem". Then, when necessary go to a lower level - closer to the machine or closer to the level of the solution. In practice you seldom need to go down the scale very far for students to get it. And you never need to recapitulate the entire history of computing to have students understand how to work in modern languages, whatever the paradigm. 



I actually try to move even further up the abstraction scale as illustrated in this  post https://cseducators.stackexchange.com/a/1379/1293

I include this in a library so that students learning other things can do simple iterations even before loops are discussed. It is quite useful to be able to do something a fixed number of times without formally counting it. However, it is only especially useful if you want to delay for and while so that you can teach, say, object-oriented abstraction principles.