Оказывается, что классы в большинстве объектно-ориентированных программах принадлежат одной из двух категорий: классы, являющиеся артефактами области реализации/программирования, например String или классы коллекций или ссылочные типы Clojure; и классы, которые представляют информацию о области приложения, например Employee, PurchaseOrder и т.д. Всегда была печальная практика использования классов для информации домена приложения, которая привела к тому, что информация была скрыта за специфичными для класса микроязыками, например даже кажующийся безобидным employee.getName() - это настраиваемый интерфейс для данных. Хранение информации в таких классах является проблемой, как если бы каждая книга была бы написана на своем языке. Вы больше не можете использовать общий подход к обработке информации. Это приводит к возрастанию ненужной специфичности и недостатку повторного использования.
Вот почему Clojure всегда поощряет хранение такой информации в ассоциативных массивах и этот совет касается и типов данных. Используя defrecord вы получаете единый способ доступа к информации, плюс дополнительные преимущества полиморфизма типов и структурной эффективности полей. С другой стороны, нет смысла для типа данных, который определяет коллекцию вроде вектора иметь реализацию ассоциативного массива, и в этом случае как раз лучшим образом подходит deftype.
В целом, defrecord будут лучше чем structmap во всех инормационно-ориентированных случаях и вы должны заменить все structmap на defrecord. Вряд ли многие пытались использовать structmap для программирования конструкций, но если это так - вы найдете deftype более подходящими.
Компилируемые перед исполнением deftype/defrecord могут подходить как замена gen-class, когда не мешают их ограничения. В этом случае они будут иметь лучшую производительность, чем gen-class.