For example, if you develop an SMS app, besides permissions on reading/writing/editing/sending messages, you will need access to contacts data, phone state and identity. Looks scary, but no SMS/MMS app can function properly without these
The app itself should not need to know about Phone State.* The OS's SMS_API support should be able to queue messages and hold them until the state allows sending. Ideally, the SMS_API should allow the app to specify Cell Only, WiFi Only or Either, then only send queued messages when the appropriate connection is available (and via the appropriate connection).
As for Identity, an app could maintain it's own identity. Not as convenient, but some people would be willing to make this trade off. Of course, over a cell connection, the network is going to know the ESN of the phone that sent the message. I suppose SMS-over-WiFi would also have the ESN, but for other IM protocols, that could be avoided. (This assumes the OS itself doesn't unnecessarily leak personal information)
Likewise, an app could maintain its own contacts data. Again, less convenient, but some people would be willing to make the trade off.
* For apps that want to pause while a phone call is in progress, the OS could handle that for apps that request being paused.