Подумайте об инкапсуляции.
Поместите их в область, где они необходимы, а не в более широкую область.
Если что-то используется только на уровне пользовательского интерфейса, не открывайте его другим слоям. Но если он используется на двух или трех уровнях, то определите его на уровне самого низкого уровня (например, если пользовательский интерфейс расположен в бизнес-логике, которая находится в базе данных, то что-то, используемое в BL и пользовательском интерфейсе, можно просто определить в BL). Или, если что-то более или менее глобально, переместите его в стороннюю общую библиотеку.
Кроме того, в первую очередь постарайтесь свести к минимуму потребность в общих сущностях: например, Рекомендуется (по уважительным причинам) избегать пользовательских исключений. Большинство из них обычно могут быть представлены в существующем системном исключении с небольшим количеством дополнительной информации (например, InvalidOperationException с подробностями в сообщении), сводя к минимуму необходимость обрабатывать целый новый класс исключений повсюду - и, конечно, устраняя необходимость принимать решение где определить тип пользовательского исключения.