I've had a few issues where users have mistakenly created public synonyms which have led to people thinking some objects are in one schema when they're actually in another schema. Everyone knows they should be using private synonyms, but occasionally they forget or they make a mistake and someone gets burned. Is it possible to GRANT users the permission to create private synonyms but disallow public ones?
In order to create public synonyms, you must have the CREATE PUBLIC SYNONYM privilege. To create synonyms in your own schema, you must have the CREATE SYNONYM privilege. So, to do what you want, use:
If users have the CREATE PUBLIC SYNONYM privilege, you can revoke it: