Почему конечный объект может быть изменен?

Я наткнулся на следующий код в базе кода, над которой я работаю:

public final class ConfigurationService {
    private static final ConfigurationService INSTANCE = new ConfigurationService();
    private List providers;

    private ConfigurationService() {
        providers = new ArrayList();
    }

    public static void addProvider(ConfigurationProvider provider) {
        INSTANCE.providers.add(provider);
    }

    ...

INSTANCE объявлен какfinal, Почему объекты могут быть добавлены вINSTANCE? Не должно ли это сделать недействительным использование финала. (Это не так).

Я предполагаю, что ответ должен что-то делать с указателями и памятью, но хотел бы знать наверняка.