In scala there are two idiomatic ways how to achieve that.
- Constructor private to the class and companion object.
Factory has access to constructor, while anyone else doesn't:
class Foo private[Foo](val x: Int)
object Foo {
  def apply(x:Int) = new Foo(x)
}
val foo = new Foo(1)  // cannot compile
val foo1 = Foo(1) //compiles fine
- Sealed abstract class.  
In scala sealed class can be extended only in the same source file it is defined. 
I suggest to make Foo sealed abstract class and return anonymous child of Foo in object's apply method.
sealed abstract class Foo(val x:Int)
object Foo {
  def apply(x:Int):Foo = new Foo(x) {}
}
In this case Foo can be created nowhere except the file where it is defined.
UPD: Actually, this question was already discussed on stackoverflow.
UPD2: Added brief overview of both methods.