Если интерфейса (именно Java-файла interface) нет, то можно сделать все то же самое.
Если вдруг выявили необходимость сделать адаптер, то в любой момент можно сделать Extract interface, и только что MailSender был классом, как вдруг он стал интерфейсом, а вся реализация уехала в какой-нибудь MailSenderImpl или SmtpMailSender (если допустим отличительной особенностью данной реализации является то, что она использует протокол smtp). И появилась рядом вторая реализация MyNewFancyMailSender, имплементящая тот же интерфейс MailSender, но под капотом делающая что-то другое.
Т.к. все это в пределах одного модуля, то это нормально. Незачем преждевременно усложнять.
К тому же, на практике в 95% случаев все равно интерфейс нового MailSender не будет совместим со старым, отчасти от того, что пока реализация одна - никто не знает, как лучше всего выделить абстракцию между разными реализациями - это просто невозможно, пока нет 3-4 разных реализации; и даже когда они есть, бывает появляется 5-я и внезапно оказывается, что она сильно отличается и абстракцию надо было выделять совсем иначе. Может быть доп. параметры понадобятся, может быть у него принцип работы другой (асинхронный вместо синхронного, например) и т.п. Так что все равно приходится идти и править вызывающую сторону.
В общем, я совершенно не против интерфейсов. И если речь именно о модульном приложении, и интерфейс используется в другом модуле относительно его реализации, то это просто необходимость. Но когда это простое одно-модульное приложение, собирающееся в один джарник, и никто не станет извне подключать его интерфейсы себе - то это немного излишне. Ну т.е., это можно делать по каким-то другим причинам. Например, как выше Александр написал - культура организации кода. Но точно не по причине того, что потом будет намного проще что-то поменять. Не будет.