I've been working on a lot of projects that deal with both internal & external system integration and the same question always arises - "What interface scheme should we use to provide/consume data from these systems?" Speaking with a lot of clients and their internal IT team, you hear a lot of different methods that have been used before. They all will potentially work, but sometimes things are overly architected. With the industry slowly moving away from your standard SDLC and more towards AGILE, the way we develop our solutions also need to change.
My idea is that when integrating with an external system, you should make your interfaces strict. What I mean by this is that there should be some sort of schema to validate the request with strong data types. These interfaces shouldn't be changing very often and since there are other organisations that could be using them, you want to cause minimal impact.
I think using WSDLs or a canonical built of an XSD is the way to go with this approach. This caters for both SOAP and other communication means like JMS.
For internal system integration, you will usually have databases, CRMs, finance systems etc. Most of these systems will have their own API's/methods for communication, but if you are going to be the provider of the service, I'd recommend using RESTful services with XML or JSON, if the end system can communicate via HTTP, or JMS. Both are lightweight and work well with an AGILE methodology. Internally you will usually have more changes due to the business not knowing exactly what they want.
These aren't strict principles that I follow and each implementation is different based on the requirements.
Let me know in the comments on your thoughts and opinions.