Synonyms provide a great layer of abstraction, allowing us to use friendly and/or local names for verbosely named or remote tables, views, procedures and functions. I have often felt that they are lacking, however, in enabling us to abstract a database or a server.
In one system I have a CRM_test database and a CRM_production database, and it would be nice to be able to change only a single synonym in order to move the main database from test to production. This is much easier than changing 80 synonyms that point to the individual objects inside the CRM database.
Similarly, if I have a linked server in dev and I want to test queries against the production server, I currently have to either search and replace for linked server names in procedure code, or drop and re-create linked servers. The former is tedious, and the latter is not always practical.