The second chunk of code you tried is almost right. The problem is private is operating in the context of instance methods instead of class methods.
To get private or private :new to work, you just need to force it to be in the context of class methods like this:
class A
class << self
private :new
end
end
Or, if you truly want to redefine new and call super
class A
class << self
private
def new(*args)
super(*args)
# additional code here
end
end
end
Class-level factory methods can access the private new just fine, but trying to instantiate directly using new will fail because new is private.