이런 제약을 가하는 이유는 객체 정의 안에는 다른 클래스 정의와 같이 toString()이나 equals()와 같은 공통 메서드 정의가 들어있기 때문이다. 이로 인해 필요시 임포트를 사용하면 이런 공통 메서드까지 임포트돼 문제가 생길 수 있다.
클래스와 마찬가지로 객체도 다른 클래스 안에 내포될 수 있고, 심지어는 다른 객체 안에 내포될 수도 있다. 이렇게 내포된 객체 선언도 싱글턴이며 전체 애플리케이션에서 인스턴스가 단 하나만 생긴다. 객체를 둘러싸고 있는 클래스마다 인스턴스를 별도로 만들어야 한다면 내부 클래스를 사용해야 한다. 하지만 객체를 함수 내부에 넣거나 지역 클래스 또는 내부 클래스 안에 넣을 수 없다. 이런 정의들은 어떤 외부 문맥에 의존하므로 싱글턴이 될 수 없기 때문이다. 객체 식(object expression)을 사용하면 지역 영역의 객체를 만들 수 있다. 이에 대한 내용은 이후에 다시 설명한다.
자바 vs. 코틀린 자바 세상에는 유틸리티 클래스(utility class)가 종종 존재한다. 유틸리티 클래스는 기본적으로 아무 인스턴스를 갖지 않고(보통은 비공개 생성자로 인스턴스 생성을 막는다) 관련 정적 메서드를 모아두는 역할만 하는 클래스다. 이런 패턴은 자바에서는 유용하지만 코틀린에서는 일반적으로 권장되지 않는 패턴이다. 무엇보다 코틀린 클래스에서는 정적 메서드를 정의할 수 없기 때문에 일반 클래스를 통해 자바와 동일한 방식의 유틸리티 클래스를 정의할 방법이 없다. 하지만 코틀린은 자바와 달리 최상위 선언을 패키지 안에 함께 모아둘 수 있으므로 불필요하게 유틸리티 클래스를 선언해야 할 필요가 없다.