Classes like these need to make their new method private and also probably want to prevent copies from being made.
The following code demonstrates one way to do that:
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ cat -n LimitingTheNumberOfInstances.rb 
     1  class Season
     2    NAMES = %w{ Spring Summer Autumn Winter }
     3    INSTANCES = []
     4  
     5    def initialize(n)
     6      @n = n
     7    end
     8  
     9    def to_s
    10      NAMES[@n]
    11    end
    12  
    13    NAMES.each_with_index { |n,i|
    14      season = new(i)
    15      INSTANCES[i] = season
    16      const_set n, season
    17    }
    18  
    19    private_class_method :allocate, :new
    20    private :dup, :clone
    21  end
    22  
    23  if __FILE__ == $0
    24    puts Season::Spring 
    25    puts Season::Summer
    26    puts Season::Autumn
    27    puts Season::Winter
    28  end
El método const_set
de la clase Module
establece el valor asociado con el nombre pasado como primer argumento al objeto dado como segundo argumento:
>> Math.const_set("HIGH_SCHOOL_PI", 22.0/7.0)
=> 3.14285714285714
>> Math::HIGH_SCHOOL_PI
=> 3.14285714285714
Cuando se ejecuta el programa anterior produce esta salida:
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ ruby LimitingTheNumberOfInstances.rb Spring Summer Autumn Winter
Casiano Rodriguez León 2015-01-07