If you are doing data warehousing then I think surrogate keys are a must for two reasons
1. Storage - particularly in large fact tables, a 4 byte int is going to be smaller and easyier to work with and so will the corresponding index you'll probably put on it.
2. Unknown Records - You have a nice easy way to reference unknown dimension values
I don't see any problem in a data warehouse of having some additional indexes to enforce integrity rules.
OLTP maybe a different story but thats not my area of expertise. 🙂
Martin